自己写的代码,记录一下。分别记录了两种partition的方法。

public class QuickSort {
public static void quickSort(int[] nums, int start, int end) {
if(start >= end) {
return;
}
int pivot = partition2(nums, start, end);
quickSort(nums, start, pivot - 1);
quickSort(nums, pivot + 1, end);
} public static int partition(int[] nums, int start, int end) {
int pivot = start;
for(int i = start + 1; i <= end; i++) {
if(nums[i] <= nums[start]) {
pivot++;
int temp = nums[pivot];
nums[pivot] = nums[i];
nums[i] = temp;
}
}
int temp = nums[pivot];
nums[pivot] = nums[start];
nums[start] = temp;
return pivot;
} // better partition method
public static int partition2(int[] nums, int start, int end) {
int pivot = start, i = start + 1, j = end;
while(i <= j) {
while(i <= end && nums[i] <= nums[pivot]) {
i++;
}
while(nums[j] >nums[pivot]) {
j--;
}
if(i >= j) {
break;
}
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
i--;
int temp = nums[i];
nums[i] = nums[pivot];
nums[pivot] = temp;
return i;
} public static void main(String[] args) {
int[] nums = new int[]{13, 6, 9, 1, 19, -21, 5};
quickSort(nums, 0, nums.length - 1);
System.out.println(nums);
}
}

//20181015

重写了partition2,上面的方法太冗余。

1. i完全可以从start开始,而不是start+1,因为nums[start]在下面也会因为和pivot相等而跳过。这样做可以避免一个错误,就是不会因为下面while的判断i<j,而跳过下面的处理。这样的话,如果数组是{1,2},也会直接从37行开始交换{2,1},这是显然错误的。

2. 这样的思路比较清晰,两个<的地方不用<=,显然是因为如果i和j是同一个元素,就不需要比较了,因为下面的操作是交换。

3.37行是交换j,因为j最后来到的地方必然是最后一个小于等于pivot的地方。这里用i-1也可以,但是j更清晰。

 class Solution {
public int findKthLargest(int[] nums, int k) {
return find(nums, k, 0, nums.length - 1);
} public int find(int[] nums, int k, int start, int end) {
int pivot = partition(nums, start, end);
if (k == end - pivot + 1) {
return nums[pivot];
} else if (k < end - pivot + 1) {
return find(nums, k, pivot + 1, end);
} else {
return find(nums, k - (end- pivot) - 1, start, pivot - 1);
}
} public int partition(int[] nums, int start, int end) {
if (start >= end) {
return start;
}
int pivot = nums[start], i = start, j = end;
while (i < j) {
while (i <= end && nums[i] <= pivot) {
i++;
}
while (nums[j] > pivot) {
j--;
}
if (i > j) {
break;
}
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
// j不可能<start,因为nums[start] == pivot
int temp = nums[start];
nums[start] = nums[j];
nums[j] = temp;
return j;
}
}

快速排序 Quick Sort的更多相关文章

  1. [算法] 快速排序 Quick Sort

    快速排序(Quick Sort)使用分治法策略. 它的基本思想是:选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分:其中一部分的所有数据都比另外一部分的所有数据都要小.然后,再按此方法对这 ...

  2. 基础排序算法之快速排序(Quick Sort)

    快速排序(Quick Sort)同样是使用了分治法的思想,相比于其他的排序方法,它所用到的空间更少,因为其可以实现原地排序.同时如果随机选取中心枢(pivot),它也是一个随机算法.最重要的是,快速排 ...

  3. 快速排序Quick sort

    快速排序Quick sort 原理,通过一趟扫描将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归 ...

  4. Java中的经典算法之快速排序(Quick Sort)

    Java中的经典算法之快速排序(Quick Sort) 快速排序的思想 基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小, 然后再按此方法对 ...

  5. 排序算法 - 快速排序(Quick Sort)

    算法思想 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod). (1) 分治法的基本思想  ...

  6. quicksort 快速排序 quick sort

    * Java基本版 package cn.mediamix; import java.util.LinkedList; public class QuickSort { public static v ...

  7. 基础算法之快速排序Quick Sort

    原理 快速排序(Quicksort)是对冒泡排序的一种改进. 从数列中挑出一个元素,称为"基准"(pivot); 排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的 ...

  8. 快速排序算法回顾 --冒泡排序Bubble Sort和快速排序Quick Sort(Python实现)

    冒泡排序的过程是首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则将两个记录交换,然后比较第二个记录和第三个记录的关键字.以此类推,直至第n-1个记录和第n个记录的关键字进行过比较为止 ...

  9. 快速排序——Quick Sort

    基本思想:(分治) 先从数列中取出一个数作为key值: 将比这个数小的数全部放在它的左边,大于或等于它的数全部放在它的右边: 对左右两个小数列重复第二步,直至各区间只有1个数. 辅助理解:挖坑填数 初 ...

  10. 排序:快速排序Quick Sort

    原理,通过一趟扫描将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序 ...

随机推荐

  1. ios中怎么样点击背景退出键盘

    //退出键盘 只需一句,药到病除 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ [self.view endEdi ...

  2. 1.Knockout.Js(简介)

    前言 最近一段时间在网上经常看到关于Knockout.js文章,于是自己就到官网看了下,不过是英文的,自己果断搞不来,借用google翻译了一下.然后刚刚发现在建立asp.net mvc4.0的应用程 ...

  3. iOS下日期的处理

    NSDate存储的是世界标准时(UTC),输出时需要根据时区转换为本地时间 Dates         NSDate类提供了创建date,比较date以及计算两个date之间间隔的功能.Date对象是 ...

  4. 在ASP.NET中实现OAuth2.0(二)之打造自己的API安全策略

    1.场景介绍 公司开发了一款APP产品,前期提供的api接口都是裸奔状态 举个例子:想要获取某一个用户的数据,只需要传递该用户的ID就可以拿走数据(说多了都是泪) 现在想给这些接口穿个衣服,加个壳(对 ...

  5. 关于在android4.1.x的版本不能启动支付宝问题

    异常:Failure calling remote service 异常日志: INFO/<unknown>(<unknown>): java.security.spec.In ...

  6. 引用类型a=b

    List<int> list = new List<int>(); list.Add(1); list.Add(2); list.Add(3); Cache["Key ...

  7. FastDFS安装配置

    FastDFS FastDFS为互联网量身定制,充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传.下载等服务 ...

  8. 基于BaseAdapter的GridView设置ImageView大小

    基于BaseAdapter的GridView设置ImageView大小 网上找了好多,都是基于SimpleAdapter的,本身在Item.xml中就对ImageView设置了id,而基于BaseAd ...

  9. 国内最快的jquery cdn

    cdnjs.cn是cdnjs.com在国内的镜像服务,项目托管与著名的又拍云存储,目前又拍云在全国有几十个cdn节点,并且还在增加中. cdnjs.cn 托管的jquery相信会成为国内最快的jque ...

  10. 用R语言对NIPS会议文档进行聚类分析

    一.用R语言建立文档矩阵 (这里我选用的是R x64 3.2.2) (这里我取的是04年NIPS共计207篇文档做分析,其中文档内容已将开头的作者名和最后的参考文献进行过滤处理) ##1.Data I ...