假定有这样一组数列 { 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 }