BFPTR 알고리즘 (서열 중 k 번 째 작은 숫자 구하 기)
3334 단어 알고리즘 소 백 승급 의 길
그 사상 은 빠 른 정렬 구분 과정 에 대한 pivot 의 최적화 에 기반 을 두 고 BFPTR 알고리즘 은 5 분 의 중위 수 를 선택 하여 구분 (중위 수의 중위 수 알고리즘) 하 는 것 이다.
프로 세 스:
코드 구현:
#include
#include
const int N = 100;
using namespace std;
bool IsBigger(int a, int b)
{
return a > b;
}
int Find_mid(int a[], int left, int right) //
{
if (left == right)
return a[left];
int n = 0;
int i = 0;
auto it = a + left;
// for 5 , 5
for (i = left; i < right - 5; i += 5,it+=5)
{
sort(it, it + 4, IsBigger); // 5
n = i - left; // i
std::swap(a[left + n / 5], a[i+2]); //
//n/5 n/5
} // , (right-left)/5
int num = right - i + 1;
//num 5
//
if (num > 0)
{
sort(it, it + num - 1, IsBigger); //
n = i - left; //
// , , ,
std::swap(a[left + n / 5], a[i + num / 2]);
}
n /= 5; //
if (n <= 1) // ,
return a[left];
else // ,
return Find_mid(a, left, left + n);
}
int Find_pos(int a[], int left, int right,int mid)
{ // a
for (int i=left;i!=right+1;i++)
{
if (mid == a[i])
return i;
}
}
int Partion(int a[], int left, int right,int pos) // ,
{
std::swap(a[pos], a[left]); //
int i = left, j = right;
int pivot = a[left]; //pivot
while (i < j) //
{
while (i < j && a[j] > pivot) // pivot
j--;
a[i] = a[j];
while (i < j && a[i] < pivot) // pivot
i++;
a[j] = a[i];
}
// ,pivot pivot ,pivot pivot
a[i] = pivot; // pivot
return i; // pivot
}
int BFPTR(int a[], int left, int right, int k) //BFPTR
{
int mid = Find_mid(a, left, right); //get
int pos = Find_pos(a, left, right, mid); //get
int i = Partion(a, left, right, pos); //get
int m = i - left + 1; // m
if (k == m)
return a[i];
if (k < m) //
BFPTR(a, left, i - left, k);
else //
// k-m
BFPTR(a, i + 1, right, k-m);
}
int main(int argc, char** argv)
{
int a[N]={ 9,6,3,8,5,2,7,4,1,0 };
cout << BFPTR(a, 0, 9, 2);
return 0;
}
:1
이 알고리즘 의 최 악의 경우 시간 복잡 도 는 O (n) 이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
BFPTR 알고리즘 (서열 중 k 번 째 작은 숫자 구하 기)1973 년 Blum, Floyd, Pratt, Rivest, Tarjan 과 함께 'Time bounds for selection' 이라는 논문 을 발표 하여 배열 에서 k 대 요소 의 평균 복잡 도 를 O (N)...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.