查找第i小的數利用了快速排序的一點思想,即以數組某個值作爲比較值,然後遍歷數組中除這個數以外的數,小於它的就放左邊,大於它的放右邊,然後作爲比較值的數放中間,並返回比較值的下標,如果下標等於i,表示就找到了,如果下標大於i,又再次從大於此下標的數組遞歸進行此過程,同理,小於i就從小於此下標的數組遞歸進行此過程,代碼:
#include <stdio.h>
#include <stdlib.h>
int partition( int *arr, int p, int r )
{
int x = arr[r];
int i = p - 1;
int j = 0;
int temp = 0;
for ( j = p; j < r; j++ ) {
if ( arr[j] <= x ) {
i += 1;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
temp = arr[i + 1];
arr[i + 1] = arr[r];
arr[r] = temp;
return i + 1;
}
int randomized_partition( int *arr, int p, int r )
{
int i = rand() % (r - p) + p;
int temp = arr[r];
arr[r] = arr[i];
arr[i] = temp;
return partition( arr, p, r );
}
int randomized_select(
int *arr,
int p,
int r,
int i )
{
if ( p == r )
return arr[p];
int q = 0, k = 0;
q = randomized_partition( arr, p, r );
k = q - p + 1;
if ( i == k )
return arr[q];
else if ( i < k )
return randomized_select( arr, p, q - 1, i );
else
return randomized_select( arr, q + 1, r, i - k );
}
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int len = 10;
int i = 8;
printf("第%d小的數是:%d\n", i, randomized_select(arr, 0, 9, i));
return 0;
}