给定数组,查找最小的k个元素或最大的k个元素 快速排序算法灵活应用

假定有这样一组数列 { 10, 33, 2, 4, 55, 6, 12, 34, 456, 66, 43, 23, 65, 1, 345, 61, 76, 31, 43, 76 };

如和求出最小的k个值,或最大的k个值?

借鉴快速排序算法,下面是本科教材《数据结构》中的快速排序:

 1 void QuickSort ( int A[ ], int head, int rear )
 2 {
 3   int pivot;
 4   if( head < rear )  // 肯定为真的条件
 5   {
 6     pivot = Partition ( A, head, rear );
 7     QuickSort( A, head, pivot-1 );
 8     QuickSort( A, pivot+1, rear );
 9   }
10 }
11 
12 int Partition ( int A[ ], int left, int right )  //这是左大右小的排序
13 {
14   int pivot = A[ left ];
15   while( left < right )
16   {
17     while( right > left && A[ right ] >= tem )
18       right--;
19     A[ left ] = A[ right ];
20     while( left < right && A[ left ] <= tem )
21       left++;
22     A[ right ] = A[ left ];
23   }
24   A[ left ] = tem;
25   return left;  //最后left=right,所以返回哪个都一样
26 }

下面稍作修改,改为仅把最小的K个元素放在前k个位置上:

 1  void QuickSearch( int A[], int head, int rear, int k )
 2 {
 3   int pivot;
 4   if ( head < rear )  //肯定为真的条件
 5   {
 6     pivot = partition( A, head, rear );
 7     if( piovt < K )
 8       QuickSearch( A, pivot-1, rear, int K-pivot );
 9     if( pivot > k )
10       QuickSearch( A, head, pivot-1, int K );      
11   }
12 }
原文地址:https://www.cnblogs.com/kevinGaoblog/p/2432574.html