void swap(int* a, int* b)
{
int t = *a;
*a = *b;
*b = t;
}
void my_sort(int a[], int left, int right)
{
if (a == 0 || right <= left) return;
int mx = left;
for (int i = left; i <= right; ++i)
{
if (a[mx] < a[i]) mx = i;
}
swap(&a[left], &a[mx]);
for (int k = left+1; k <= right; ++k)
{
int p = k;
int t = a[k];
while (a[--p] < t) a[p+1] = a[p];
a[p+1] = t;
}
}
// put the reference in the end of the array
int partion(int a[], int left, int right)
{
int i = left - 1;
int j = right;
while (1)
{
while ((++i) <= right && a[i] > a[right]);
while ((--j) >= left && a[j] < a[right]);
if (i >= j) break;
swap(&a[i], &a[j]);
}
swap(a[i], a[right]);
return i;
}
// select the Kth number of the array, return index of the number
int select(int a[], int left, int right, int k)
{
if (right - left < 5) return left+k;
// divide by 5
for (int i = 0; i < (right - left -4)/5; ++i)
{
my_sort(a, left+5*i, left+5*i+4);
swap(a+left+i, a+left+5*i+2);
}
int x = select(a, left, left+(right-left-4)/5, (right-left+6)/10);
swap(&a[right], &a[x]);// put the mid number in the last of the array
int p = partion(a, left, right);
int j = p - left +1;
if (k <= j) return select(a, left, p, k);
else return select(a, p+1, right, k - j);
}
线性时间选择
最新推荐文章于 2022-04-11 16:50:47 发布