求无序数组第K大的数
来源:互联网 发布:淘宝内容营销怎么做 编辑:程序博客网 时间:2024/04/28 20:32
给出一个数组,要求查找出这个数组中按顺序排第K大的数字
思路一:
利用快排算法先将数组排序,然后在定位到第K个元素即可,算法复杂度为O(nlogn)
思路二:
利用快排和二分查找,先把数组分成两个部分,左边的比数轴pivot小,右边的比数轴pivot大。然后再比较pivot的位置和K的关系,如果比K大,那么第K个值就在pivot的左边,反之若比K小,则第K个值就在pivot的右边,若相等则直接返回。这种方法的复杂度要低一些。
思路一:
利用快排算法先将数组排序,然后在定位到第K个元素即可,算法复杂度为O(nlogn)
思路二:
利用快排和二分查找,先把数组分成两个部分,左边的比数轴pivot小,右边的比数轴pivot大。然后再比较pivot的位置和K的关系,如果比K大,那么第K个值就在pivot的左边,反之若比K小,则第K个值就在pivot的右边,若相等则直接返回。这种方法的复杂度要低一些。
代码如下:
int partition(int arr[], int low, int high){int pivot = arr[low];while(low < high){while(low < high && arr[high] >= pivot) high--; arr[low] = arr[high]; while(low < high && arr[low] <= pivot) low++; arr[high] = arr[low];}arr[low] = pivot;return low;}int findKth(int arr[], int low, int high, int k){ int kth;if(low == high) kth = arr[low];else{int pivot = arr[low];int splitPoint = partition(arr, low, high);if(k-1 == splitPoint) //数组是从0开始的,所以比较时给K减了1 kth = pivot;else if(k-1 < splitPoint) kth = findKth(arr, low, splitPoint-1, k); else if(k-1 > splitPoint) kth = findKth(arr, splitPoint+1, high, k);}return kth;}
- 求无序数组第K大的数
- 无序数组求第K大
- 无序数组找出其中的第K大的数
- 寻找无序数组中第k大的数
- 在无序数组中找到第k大的数
- 求数组第K大的数
- java 实现从无序数组中 找出第k大的数, 无序数组充许有重复元素
- 求无序数组第K大的数值,及其所在的位置
- 编程练习——求无序数组第k小的数
- 【滴滴笔试】利用快排找到一个无序的数组中的第K大的数
- 求数组中第k大的数的位置
- 求一个数组的第K大的数
- 面试题—— 找出一个无序整型数组中第k大的数。
- 寻找无序数组中第k大的数——快排思想
- 关于求N个无序数中第K大的数。
- 二分求两个有序数组第k大的数
- 树状数组 求第K大的数 Swun1012
- 求数组中第k大的数
- Windows下列出所有文件 FindFirstFile
- eclipse常用插件安装
- iPhone OS提供的音频单元
- C++编程2013.04.10
- 彻底明白Java的IO系统
- 求无序数组第K大的数
- 冒泡排序
- tcp 通信---cilent
- IOS持久化数据----(保存数据的一系列方法)
- hdu 1527 取石子游戏
- ORACLE NVARCHAR与VARCHAR的问题
- android学习笔记---34_Activity的启动模式
- tcp 通信---MultiServer
- 微软设备中心(WMDC)使用教程[手机U盘模式][共享电脑网络]及WP数据