博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
输出数组第k大的元素
阅读量:6122 次
发布时间:2019-06-21

本文共 3296 字,大约阅读时间需要 10 分钟。

用快速排序的思想输出数组第k大的元素:

1 #include
2 #include
3 using namespace std; 4 5 //递归实现:返回数组第k大的值.数组下标区间是[begin,end].其中数组假定n个元素,则k的值在区间[1,n]. 6 //能够使用这种方法的前提条件是:n个数不能重复。如果n个数中有重复,那么区间的大小不能保证就是第K大。 7 int findkth(int* arr, int begin, int end, int k) 8 { 9 int key=arr[begin]; 10 int i=begin,j=end;11 while(i
=key) i++;16 arr[j]=arr[i];17 }18 arr[i]=key;19 20 //递归的结束条件为某一记录刚好划分到第k个位置21 //由于数组从0开始,所以需要加1了22 if (i == k-1)return arr[i];23 else if (i < k-1) return findkth(arr, i+1, end, k);24 else return findkth(arr, begin, i-1, k);25 }26 27 28 //只做了一轮划分,没有递归完成快速排序.返回的是划分的下标。数组a[]下标区间[low,high]29 template
30 int partition(T a[],int low,int high) 31 {32 T key=a[low];33 int i=low,j=high; 34 while(i
=key) j--;37 a[i]=a[j];38 while(i
51 T findkth2(T a[],int n,int k)52 {53 int low=0,high=n-1;54 while(1)55 {56 int pos=partition(a,low,high);57 if(pos==n-k) return a[pos];58 else if(pos
n-k)64 {65 high=pos-1;66 low=0;67 }68 }69 }70 71 int main() 72 {73 int a[11]={ 78934,234,65,32,543,354,567,3412,23,547,423};74 int b[11]={ 78934,234,65,32,543,354,567,3412,23,547,423};75 int c[11]={ 78934,234,65,32,543,354,567,3412,23,547,423};76 77 for(int i=0;i<11;i++) cout<
<<" ";78 cout<
=1;i--)84 cout<
<<" ";85 cout<
=1;i--)88 cout<
<<" ";89 cout<

参考:http://blog.csdn.net/guangwen_lv/article/details/39674241

利用快速排序的特点:第一遍排序会确定一个数的位置,这个数左边都比它大,右边都比他小(降序),当左边区间大于K时,说明我们求的第K大数在左边区间,这时我们可以舍弃右边区间,将范围缩小到左边区间从而重复上述过程,直到确定一个数的位置时,左边区间的小是K-1那么这个数字就是我们所求。右边同理。

 能够使用这种方法的前提条件是:n个数不能重复。如果n个数中有重复,那么区间的大小不能保证就是第K大。可以用HASH判重来将重复的数据去掉。然后再使用上述方法。

 

 

也可阅读如下另一位网友的java代码:

1 /** * Created with IntelliJ IDEA.  2 * User: hqtc  3 * Date: 16-3-22  4 * Time: 下午9:52  5 * To change this template use File | Settings | File Templates.  6 */ 7 public class QuickSort{ 8  9     private int getSeparatorIndex(int[] nums, int low, int high) {10         int k = nums[low];11         while (low < high) {12             while (k < nums[high] && low < high) {13                 high--;14             }15             if (low < high)16                 nums[low++] = nums[high];17             while (k > nums[low] && low < high) {18                 low++;19             }20             if (low < high)21                 nums[high--] = nums[low];22         }23         nums[low] = k;24         return low;25     }26 27     public void sort(int num[], int low, int high) {28         if (low < high) {29             int sepIndex = getSeparatorIndex(num, low, high);30             sort(num, low, sepIndex - 1);31             sort(num, sepIndex + 1, high);32         }33     }34 35     public int findKthMax(int arr[], int k, int left, int right) {36         int sepIndex = getSeparatorIndex(arr, left, right);37         if (k == arr.length - sepIndex) {38             return arr[sepIndex];39         } else {40             if (k > arr.length - sepIndex) {41                 return findKthMax(arr, k, left, sepIndex - 1);42             } else {43                 return findKthMax(arr, k, sepIndex + 1, right);44             }45         }46     }47 }48 49 /*作者:环球探测50 链接:http://www.jianshu.com/p/9f887dfc374a51 來源:简书52 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。*/

 

你可能感兴趣的文章
Zxing二维码扫描
查看>>
MMU的作用
查看>>
决心书
查看>>
zookeeper的图形化展示
查看>>
Vue-router重修01
查看>>
进制间的互相转换适用版
查看>>
海量数据处理 - 10亿个数中找出最大的10000个数(top K问题)
查看>>
项目文件缩写介绍
查看>>
springmvc文件上传
查看>>
C#利用NOPI处理Excel的代码
查看>>
关于Apache的性能优化
查看>>
python中unicode字符串前缀u
查看>>
人人都爱易电源——转发有礼!
查看>>
基于滑动窗口协议写的程序(UDP实现) .
查看>>
读取文档
查看>>
Response.Redirect(),Server.Transfer(),Server.Execute()的区别与网站优化
查看>>
validator
查看>>
linux命令备忘录
查看>>
用原生js实现一个页面乘法口诀表
查看>>
HttpWebRequest.GetResponse 方法 转载
查看>>