给定数组,查找最小的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/archive/2012/04/04/2432574.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值