快排找出第K大的数(C++实现)

蔚落 2024-03-16 14:46 162阅读 0赞

算法实现:

  1. #include <stdio.h>
  2. void printAll(int a[], int n){
  3. int i;
  4. for(i=0; i<n; i++){
  5. printf("%d ", a[i]);
  6. }
  7. }
  8. void quick_find_K(int a[], int low, int high, int kn){
  9. int base = a[low];
  10. int i=low, j=high, k=low;
  11. // 终止条件:i和j碰面,即i=j
  12. while(i < j){
  13. // 当i不为坑的下标
  14. while(i!=k){
  15. // 且i对应元素小于或等于基准元素,右移
  16. if(a[i] <= base){
  17. i++;
  18. // 当i对应元素大于基准元素,则与坑进行交换
  19. }else{
  20. a[k] = a[i];
  21. k = i;
  22. }
  23. }
  24. // 当j不为坑的下标
  25. while(j!=k){
  26. // 且j对应元素大于或等于基准元素,左移
  27. if(a[j] > base){
  28. j--;
  29. // 当j对应元素小于基准元素,则与坑进行交换
  30. }else{
  31. a[k] = a[j];
  32. k = j;
  33. }
  34. }
  35. }
  36. // 基准元素放到i和j的相遇位置,完成基准元素的位置定位
  37. a[i] = base;
  38. // 如果i与要求第k大的元素位置相等,则打印其值并结束
  39. if(i == kn){
  40. printf("%d", a[i]);
  41. // 如果i小于第k大的元素位置,由于快排的特性,第k大元素位置一定在右边
  42. }else if(i < kn){
  43. quick_find_K(a, i+1, high, kn);
  44. // 如果大于第k大的元素位置,由于快排的特性,第k大元素位置一定在左边
  45. }else{
  46. quick_find_K(a, low, i-1, kn);
  47. }
  48. }
  49. int main(){
  50. int a[9] = {27, 84, 21, 47, 15, 25, 68, 35, 24};
  51. int k = 3;
  52. quick_find_K(a, 0, 8, 9-k);
  53. printf("\n");
  54. return 0;
  55. }

发表评论

表情:
评论列表 (有 0 条评论,162人围观)

还没有评论,来说两句吧...

相关阅读

    相关 k

    思路就是快排结合第k大。 注意两个点:一,你排序的时候,是从小到大地排序,所以如果是找倒数第k大的数字的话,应该返回的是倒数的第k个,就需要转换成n-k 个 注意第二个