快速排序 && 寻找第K大(小)的数
参考:https://minenet.me/2016/08/24/quickSort.html
快速排序
利用分治法可将快速排序的分为三步:
- 在数据集之中,选择一个元素作为”基准”。
- 所有小于”基准”的元素,都移到”基准”的左边;所有大于”基准”的元素,都移到”基准”的右边。这个操作称为分区 (partition) 操作,分区操作结束后,基准元素所处的位置就是最终排序后它的位置。
- 对”基准”左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
def quickSort(arr, left, right):
if left >= right:
return
low, high = left, right
key = arr[low]
while low < high:
while low < high and arr[high] >= key:
high -= 1
arr[low], arr[high] = arr[high], arr[low]
while low < high and arr[low] <= key:
low += 1
arr[low], arr[high] = arr[high], arr[low]
quickSort(arr, left, low-1)
quickSort(arr, low+1, right)
if __name__ == '__main__':
arr = [4, 5, 2, 1, 5, 8, 3, 2, 6]
quickSort(arr, 0, len(arr)-1)
print arr
Java
import java.util.Scanner;
public class Main{
private void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
public void quickSort(int[] arr, int left, int right) {
if (left >= right) {
return;
}
int key = arr[left], low = left, high = right;
while (low < high) {
while (low < high && arr[high] > key) {
high--;
}
swap(arr, low, high);
while (low < high && arr[low] < key) {
low++;
}
swap(arr, low, high);
}
quickSort(arr, left, low-1);
quickSort(arr, low+1, right);
}
public static void main(String[] args) {
Main mainObj = new Main();
Scanner in = new Scanner(System.in);
while(in.hasNext()) {
int n = Integer.parseInt(in.next());
int[] a = new int[n];
for (int i=0; i<n; i++) {
a[i] = Integer.parseInt(in.next());
}
mainObj.quickSort(a, 0, a.length-1);
System.out.println("Sorted a : ");
for (int i=0; i<a.length; i++) {
System.out.print(a[i] + " ");
}
}
in.close();
}
}
寻找第K大(小)的数
寻找第K小的数:
- 快速排序中确定基准值后,将数组分为两部分,基准元素前面的一定小于基准元素。后面的大于基准元素。
- 如果基准元素前面的元素个数大于K个,则第K小的数一定在基准元素的前面,没必要进行后面的排序。否则就在后面,没必要前面的排序
- 直到这个基准元素的位置刚好是K-1
# 寻找第K小的数
def kNum(arr, k):
if not arr or k <= 0 or k > len(arr):
return None
index = partition(arr, 0, len(arr)-1)
while k-1 != index:
if k-1 < index:
index = partition(arr, 0, index-1)
else:
index = partition(arr, index+1, len(arr)-1)
return arr[k-1]
def partition(arr, low, high):
key = arr[low]
while low < high:
while low < high and arr[high] >= key:
high -= 1
arr[low], arr[high] = arr[high], arr[low]
while low < high and arr[low] <= key:
low += 1
arr[low], arr[high] = arr[high], arr[low]
return low
if __name__ == '__main__':
arr = [4, 5, 2, 1, 5, 8, 3, 2, 6]
print kNum(arr,9)
快速排序 && 寻找第K大(小)的数的更多相关文章
- 一题多解(五) —— topK(数组中第 k 大/小的数)
根据对称性,第 k 大和第 k 小,在实现上,是一致的,我们就以第 k 小为例,进行说明: 法 1 直接排序(sort(A, A+N)),当使用一般时间复杂度的排序算法时,其时间复杂度为 O(N2) ...
- 寻找第K大的数(快速排序的应用)
有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数.给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在.测试样例:[1,3,5,2,2],5, ...
- 寻找第K大的数
在一堆数据中查找到第k个大的值. 名称是:设计一组N个数,确定其中第k个最大值,这是一个选择问题,解决这个问题的方法很多. 所谓“第(前)k大数问题”指的是在长度为n(n>=k)的乱序数组中S找 ...
- 数组,寻找第K大的数
时间复杂度 O(n) def partition(data,left,right): if (len(data)<=0 or left<0 or right>=len(data)): ...
- Coursera Algorithms week3 快速排序 练习测验: Selection in two sorted arrays(从两个有序数组中寻找第K大元素)
题目原文 Selection in two sorted arrays. Given two sorted arrays a[] and b[], of sizes n1 and n2, respec ...
- [SOJ]寻找第k大数字(numberk)
Description 经过长时间的筹备工作,在Jourk,Ronny,Plipala,阿长,阿沈等人的努力下,DM实验室建立起自己的系列网站,其中包括三个大板块:DMOJ首页.DMOJ论坛.DMOJ ...
- 快速选择算法/Select 寻找第k大的数
参考算法导论9.3节的内容和这位大神的博客:http://blog.csdn.net/v_JULY_v上对这一节内容代码的实现进行了学习 尝试实现了以查找中位数为前提的select算法. 算法功能:可 ...
- 分治法寻找第k大的数
利用快速排序的思想·去做 #include<iostream>using namespace std;int FindKthMax(int*list, int left, int righ ...
- 寻找第K大 网易2016实习研发工程师编程题
有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5,2,2] ...
随机推荐
- Scrat
前端工程化集成:Scrat UC团队在百度FIS基础上二次开发的模块化开发框架,可以与vue配合使用
- windows 10安装python3和python2
安装包下载: 安装包下载请点我 下载完安装包就可以开始安装了,下面是流程图! Python3.6安装流程: 选择自定义安装: 直接next 为电脑上的所有用户安装 然后install就ok了! 安装完 ...
- telnet ip 端口
telnet ip 端口 1.关闭防火墙, 2.配置防火墙,出入端规则
- Thread的几种方法的使用
1:setPriority() 设置线程的优先级,从1 到10. 5是默认的. 1是最低优先级. 10是最高优先级 public class MyThread01 implements Runn ...
- Element ui 中的Upload用法
效果图: 代码:
- Java——容器(Interator)
[Interator接口] <1> 所有实现了Collection接口的容器类都有一个interator方法用以返回一个实现了Interaor接口的对象. <2> Inte ...
- redhat 6.8 配置 centos6 163 的 yum 源
1. 检查是否安装yum包[root@node1 rpms]# rpm -qa|grep yum 2. 删除自带的yum包[root@node1 rpms]# rpm -qa|grep yum|xar ...
- ubuntu命令整理中
系统变量文件: ~/.bashrc 打印系统变量:echo $ANDROID_NDK 查看磁盘空间:df -h 解压缩: .tar.gz 解压:tar zxvf FileName.tar.gz 压缩: ...
- bash中前后移动一个单词和删除单词的快捷键
bash中一个很重要的快捷键,就是向后删除一个单词: ctrl+w=ctrl+W 一个字符一个字符的移动是: ctrl+f, ctrl+b 但是, 一个单词一个单词的移动是: (但是, 这个用得比较少 ...
- Retrofit RestAdapter 配置说明
RestAdapter.Builder builder = new RestAdapter.Builder(); builder.setEndpoint(ip地址 ...