1 //问题描述: 试编写一个算法,使之能够在数组L[1...n]中找出第k小的元素(即从小到大排序后处于第k个位置的元素) 2 3 #include <stdio.h> 4 5 // 结合快排思想,查找第5小函数 6 int find_the_minist_k(int sz[], int k, int low, int high) 7 { 8 int lowtemp = low, hightemp = high; // 由于下面修改low, high并且下面递归会用到low, high 9 int pivot = sz[low]; 10 while (low < high) 11 { 12 while (low < high && sz[high] >= pivot) 13 high--; 14 sz[low] = sz[high]; 15 while (low < high && sz[low] <= pivot) 16 low++; 17 sz[high] = sz[low]; 18 } 19 sz[low] = pivot; 20 // 上面即为快排的划分算法 21 if (low == k) // 由于与k相同,直接返回pivot元素 22 return sz[low]; 23 else if (low > k) //枢轴值大于k,在前一部分表中递归查找 24 return find_the_minist_k(sz, k, lowtemp, low - 1); 25 else // 枢轴值小于k,在后一部分中递归查找,注意,查找的k应为k减去前一部分表长度 26 return find_the_minist_k(sz, k - low, low + 1, hightemp); 27 } 28 int main() 29 { 30 int a[] = {0, 5, 10, 8, 100, 50, -10, 60}; 31 // 查找数组a中第3小的元素,数组长度为8 32 int the_k_number = find_the_minist_k(a, 3, 0, 7); 33 printf("%d\n", the_k_number); 34 return 0; 35 }
原文:https://www.cnblogs.com/sqdtss/p/10739168.html