采用快速排序的思想实现.
选择tmp作为枢纽进行排序,把比他小的数都放在他的左边,比他大的数放在他的右边.找到它的位置.
然后以tmp位置进行查找:
如果他的位置 == k-1, 那么它就是第k个最小的数;
如果它的位置 < k-1, 那么第k个小的元素一定在数组的右半部分, 然后在它的右半部分继续查找;
如果它的位置 > k-1, 那么第k个小的元素一定在数组的左半部分, 然后在它的左半部分继续查找;
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
//得到数组中第任意K大的数字位置
int qort(int arr[],int left,int right)
{
int tmp = arr[left];
right--;
while (left < right)
{
while (left<right && arr[right]>=tmp)
{
right--;
}
if (arr[right]<tmp)
{
arr[left] = arr[right];
arr[right] = tmp;
}
while (left<right && arr[left]<=tmp)
{
left++;
}
if (arr[left]>tmp)
{
arr[right] = arr[left];
arr[left] = tmp;
}
}
return right;
}
//根据得到的任意第k大数字位置与k-1进行比较查找
void PreKNum(int *arr, int len, int k)
{
int left = 0;
int right = len ;
int par = qort(arr, left, right);
int i = 0;
while (par != k - 1)
{
if (par > k - 1)
{
right = par - 1;
par = qort(arr, left, right);
}
else
{
left = par + 1;
par = qort(arr, left, right);
}
}
for (i = 0; i < k; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int main()
{
int arr[] = { 2,3,5,8,9,10, 1,6};
int len = sizeof(arr) / sizeof(arr[0]);
PreKNum(arr, len, 5);
system("pause");
return 0;
}