参考:https://minenet.me/2016/08/24/quickSort.html

快速排序

利用分治法可将快速排序的分为三步:

  1. 在数据集之中,选择一个元素作为”基准”。
  2. 所有小于”基准”的元素,都移到”基准”的左边;所有大于”基准”的元素,都移到”基准”的右边。这个操作称为分区 (partition) 操作,分区操作结束后,基准元素所处的位置就是最终排序后它的位置。
  3. 对”基准”左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
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小的数:

  1. 快速排序中确定基准值后,将数组分为两部分,基准元素前面的一定小于基准元素。后面的大于基准元素。
  2. 如果基准元素前面的元素个数大于K个,则第K小的数一定在基准元素的前面,没必要进行后面的排序。否则就在后面,没必要前面的排序
  3. 直到这个基准元素的位置刚好是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大(小)的数的更多相关文章

  1. 一题多解(五) —— topK(数组中第 k 大/小的数)

    根据对称性,第 k 大和第 k 小,在实现上,是一致的,我们就以第 k 小为例,进行说明: 法 1 直接排序(sort(A, A+N)),当使用一般时间复杂度的排序算法时,其时间复杂度为 O(N2) ...

  2. 寻找第K大的数(快速排序的应用)

    有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数.给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在.测试样例:[1,3,5,2,2],5, ...

  3. 寻找第K大的数

    在一堆数据中查找到第k个大的值. 名称是:设计一组N个数,确定其中第k个最大值,这是一个选择问题,解决这个问题的方法很多. 所谓“第(前)k大数问题”指的是在长度为n(n>=k)的乱序数组中S找 ...

  4. 数组,寻找第K大的数

    时间复杂度 O(n) def partition(data,left,right): if (len(data)<=0 or left<0 or right>=len(data)): ...

  5. 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 ...

  6. [SOJ]寻找第k大数字(numberk)

    Description 经过长时间的筹备工作,在Jourk,Ronny,Plipala,阿长,阿沈等人的努力下,DM实验室建立起自己的系列网站,其中包括三个大板块:DMOJ首页.DMOJ论坛.DMOJ ...

  7. 快速选择算法/Select 寻找第k大的数

    参考算法导论9.3节的内容和这位大神的博客:http://blog.csdn.net/v_JULY_v上对这一节内容代码的实现进行了学习 尝试实现了以查找中位数为前提的select算法. 算法功能:可 ...

  8. 分治法寻找第k大的数

    利用快速排序的思想·去做 #include<iostream>using namespace std;int FindKthMax(int*list, int left, int righ ...

  9. 寻找第K大 网易2016实习研发工程师编程题

    有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5,2,2] ...

随机推荐

  1. 最小可观(Minimal Observability Problem in Conjunctive Boolean Networks)

    论文链接 1. 什么是 conjunctive Boolean network (CBN) 仅仅包含and运算. 下面这个式子为恒定更新函数 2. 什么是可观 定义在时刻k是CBN的状态为 X(k) ...

  2. 【微信小程序】使用vscode编写微信小程序项目

    1. 在微信开发者工具(以下简称:开发者)中新建一个模板微信小程序 2. 在开发者中将模拟器分隔开 3. 设置在保存时编译 4. 在vscode中打开项目目录 5. 下载代码提示插件 这样就可以在vs ...

  3. Delphi 2010 secondsBetween Bug

    在设置定时任务时,无意之间发现一个BUG, 定时在00:10:00的任务,执行了2次, 百思不得其解, 一调试发现, 00:10:00,00:09:59的secondsBetween结果值是0, 正确 ...

  4. java伪代码读后感

    愚公,在这位名家身上,浓缩了项目的组织者,团队经理,编程人员,技术分析师等众多角色的优秀素质.原始需求的产生“惩山北之塞,出入之迁”项目沟通的基本方式“聚室而谋之”项目的目标“毕力平险,指通豫南,达于 ...

  5. SQL server 表copy 到别一张表

    SQL server  表copy 到别一张表 ------------------ INSERT INTO  表名 (表字段)   SELECT  表1字段 FROM 表名2: ---------- ...

  6. Java——容器(Map)

    [Map接口]  

  7. Java——容器(泛型)

    [泛型]  起因:JDK1.4之前类型不明确  <1>装入集合的类型都被当做Object对待,从而失去自己的实际类型.  <2>从集合中取出时往往需要转型,效率低,且很容易出错 ...

  8. 获取第几个class

    假如类名为a,如果是同级(兄弟元素)的,如:<ul><li class='a'></li><li class='a'></li></u ...

  9. 【bzoj4136】[FJOI2015]带子串包含约束LCS问题

    题目描述: 带有子串包含约束的最长公共子序列问题可以具体表述如下. 给定2个长度分别为n和m的序列X和Y,以及一个子串包含约束集S. S中共有k个字符串S={S1,S2,…,Sk},其中字符串Si的长 ...

  10. MVP 实战

    那么我们下面就要将这个类中的代码改写为 MVP 的写法,回顾上面提及的 MVP 架构的思想,它是将 View 层与 Model 层彻底隔离,意味着 View 和 Model 都不再持对方的引用,它们通 ...