直接上代码了,和快速排序没什么区别
#include <stdio.h>
//当元素个数达到一定数量时可以用简单的排序算法
#define CutOff 3
//插入排序
void InsertionSort(int array[], int size)
{
int i, j, temp;
for(i = 1; i < size; i++)
{
temp = array[i];
for(j = i; j > 0 && array[j - 1] > temp; j--)
{
array[j] = temp;
}
array[j] = temp;
}
}
//交换两个值
void Swap(int *i, int *j)
{
(*i) = (*i) - (*j);
(*j) = (*i) + (*j);
(*i) = (*j) - (*i);
}
//取中值
int Median(int array[], int left, int right)
{
int center = (left + right)/2;
if(array[left] > array[center])
{
Swap(&array[left], &array[center]);
}
if(array[left] > array[right])
{
Swap(&array[left], &array[right]);
}
if(array[center] > array[right])
{
Swap(&array[center], &array[right]);
}
Swap(&array[center], &array[right - 1]);
return array[right - 1];
}
//快速选择组件
void QuickSelectComponment(int array[], int left, int right, int searchIndex)
{
int leftPos, rightPos, piovt;
leftPos = left;
rightPos = right - 1;
if(right - left >= CutOff)
{
piovt = Median(array, left, right);
while(true)
{
while(array[++leftPos] < piovt){};
while(array[--rightPos] > piovt){};
if(leftPos < rightPos)
{
Swap(&array[leftPos], &array[rightPos]);
}
else
{
break;
}
}
Swap(&array[leftPos], &array[right - 1]);
if(searchIndex <= leftPos)
{
QuickSelectComponment(array, left, leftPos - 1, searchIndex);
}
else if(searchIndex > leftPos + 1)
{
QuickSelectComponment(array, leftPos + 1, right, searchIndex);
}
}
else
{
InsertionSort(array + left, right - left + 1);
}
}
//快速选择,返回第K个最小的数
int QuickSelect(int array[], int size, int searchIndex)
{
if(searchIndex > size)
{
return EOF;
}
QuickSelectComponment(array, 0, size - 1, searchIndex);
return array[searchIndex - 1];
}
int main(void)
{
int array[] = {4,2,3,1,5,6,7};
int size = sizeof(array)/sizeof(array[0]);
printf("%d\n", QuickSelect(array, size, 6));
return 0;
}