快速排序 Quick Sort
自己写的代码,记录一下。分别记录了两种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的更多相关文章
- [算法] 快速排序 Quick Sort
快速排序(Quick Sort)使用分治法策略. 它的基本思想是:选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分:其中一部分的所有数据都比另外一部分的所有数据都要小.然后,再按此方法对这 ...
- 基础排序算法之快速排序(Quick Sort)
快速排序(Quick Sort)同样是使用了分治法的思想,相比于其他的排序方法,它所用到的空间更少,因为其可以实现原地排序.同时如果随机选取中心枢(pivot),它也是一个随机算法.最重要的是,快速排 ...
- 快速排序Quick sort
快速排序Quick sort 原理,通过一趟扫描将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归 ...
- Java中的经典算法之快速排序(Quick Sort)
Java中的经典算法之快速排序(Quick Sort) 快速排序的思想 基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小, 然后再按此方法对 ...
- 排序算法 - 快速排序(Quick Sort)
算法思想 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod). (1) 分治法的基本思想 ...
- quicksort 快速排序 quick sort
* Java基本版 package cn.mediamix; import java.util.LinkedList; public class QuickSort { public static v ...
- 基础算法之快速排序Quick Sort
原理 快速排序(Quicksort)是对冒泡排序的一种改进. 从数列中挑出一个元素,称为"基准"(pivot); 排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的 ...
- 快速排序算法回顾 --冒泡排序Bubble Sort和快速排序Quick Sort(Python实现)
冒泡排序的过程是首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则将两个记录交换,然后比较第二个记录和第三个记录的关键字.以此类推,直至第n-1个记录和第n个记录的关键字进行过比较为止 ...
- 快速排序——Quick Sort
基本思想:(分治) 先从数列中取出一个数作为key值: 将比这个数小的数全部放在它的左边,大于或等于它的数全部放在它的右边: 对左右两个小数列重复第二步,直至各区间只有1个数. 辅助理解:挖坑填数 初 ...
- 排序:快速排序Quick Sort
原理,通过一趟扫描将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序 ...
随机推荐
- hdu 5104 Primes Problem
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5104 Primes Problem Description Given a number n, ple ...
- android开发系列之6*0.9不等于5.4
昨天晚上我们客户端平台上面曝出了一个很奇诡的bug,那就是本来在客户端里面有个商品买6元,但是因为碰巧赶上打9折,这个时候我们很自然的处理就是6*0.9.好吧你以为so easy的事情,其实就出错了, ...
- Go字典
字典(map)是Go语言内置的数据结构,一组键值对的无序集合. 看代码: package main import "fmt" func main() { //使用make申请一个m ...
- IOS开发的国际化
一 app中内容的国际化 1 添加简体中文支持(默认只有英文) 在xcode的PROJECT->Info->Localizations下添加简体中文的支持. 2新建St ...
- 软件工程随堂小作业—— 寻找“水王”(C++)
一.设计思路 (1)输入发帖ID记录表 (2)从第一个ID开始,与后续的发帖ID进行比较,若相同计数器则加一,否则减一.若计数器的数值被减为零,则重新选取当前ID开始记录比较. (3)输出结果 二.源 ...
- 四则运算程序扩展:将程序改为java语言,并允许用户输入,对输入结果进行验证
题目 每个同学选一个方向,把程序扩展一下:1.让程序能接受用户输入答案,并判定对错.最后给出总共对/错 的数量.2.把程序变成一个网页程序,用户通过设定参数,就可以得到各种题目.3.把程序变成一个Wi ...
- public、protect、private在父类子类中使用
先贴出一张,直观的.估计大家都见过的关于public.protect.private的范围图 作用域 当前类 同一package 子孙类 其他package public T ...
- android 后台代码设置动画
1.设置旋转动画 final RotateAnimation animation =new RotateAnimation(0f,360f,Animation.RELATIVE_TO_SELF, 0. ...
- 浅谈自我对git的初步认识
本学期我们新增了一门课程,那就是软件工程,不知道为什么,感觉有种莫名的高大上.哈哈!难道是这个名称太抽象了吗?这个问题我感觉到后来肯定就明白了. 第一次博客,感觉好紧张哦,嘿嘿!老师让我们谈谈对git ...
- bzoj 2697 贪心
就贪心就行了,首先可以看成n个格子,放物品,那么 一个物品假设放3个,放在1,k,n处,那么价值和放在1,n 是一样的,所以一个物品只放两个就行了,价值大的应该尽量放 在两边,那么排序之后模拟就行了 ...