Java中的经典算法之快速排序(Quick Sort)
Java中的经典算法之快速排序(Quick Sort)
快速排序的思想
基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,
然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
假定数组A:46 30 82 90 56 17 95 15,取第一个数46位基数,l=0(l是字母,不是数字1)指向第一个数,h=7指向最后一个数:
从右向左找出第一个小于46的数;先比较A[0]和A[7]:
46 30 82 90 56 17 95 15
=》46和15比较=》15 30 82 90 56 17 95 46:交换位置,此时l需要+1变为l=1;h=7
(如果之前比较没有找到小于46的数,则继续取h=6位置的数和46比较,直到取到小于46的数为止)
然后从左向右找出第一个大于46的数:比较A[1]和A[7]:
15 30 82 90 56 17 95 46
=》30和46比较=》15 30 82 90 56 17 95 46:未交换位置,继续取左边下一个数字,
继续从左向右找出第一个大于46的数,此时所以l=2;h=7;比较A[2]和A[7]:
15 30 82 90 56 17 95 46
=》82和46比较=》15 30 46 90 56 17 95 82:交换位置
此时需要从右向左再找出下一个比46小的数,所以l=2,h=6,比较A[2]和A[6]:
15 30 46 90 56 17 95 82
=》46和95比较=》15 30 46 90 56 17 95 82:未交换位置
继续从左向右找比46小的数字,此时l=2,h=5,比较A[2]和A[5]:
15 30 46 90 56 17 95 46
=》46和17比较=》15 30 17 90 56 46 95 82:交换位置
再从左向右找比46大的数字,此时l=3,h=5;比较A[3]和A[5]:
15 30 17 90 56 46 95 82
=》90和46比较=》15 30 17 46 56 90 95 82:交换位置
再从右向左找比46小的数字,此时l=3,h=4; 比较A[3]和A[4]:
15 30 17 46 56 90 95 82
=》46和56比较=》15 30 17 42 56 90 95 82:为交换位置
继续从右向左找比46小的数字,此时l=3,h=3,l==h;此时A[3]左边数字(15,30,17,)全部是小于右边数字(90,95,82)的;
然后对子序列各自进行如上排序,直到子序列元素个数不大于1为止;
public static void main(String[] args) {
int[] a = {46, 30, 82, 90, 56, 17, 95, 15};
int start = 0;
int end = a.length - 1;
sort(a, start, end);
for (int anA : a) {
System.out.println(anA);
}
}
public static void sort(int arr[], int low, int high) {
int l = low;
int h = high;
int baseNum = arr[low];
while (l < h) {
//1.从右向左查找小于指定基数的数,找到之后跳出循环执行下面if循环,交换数据
while (l < h && arr[h] >= baseNum) {
h--;
}
//交换数据
if (l < h) {
int temp = arr[h];
arr[h] = arr[l];
arr[l] = temp;
l++;
}
//2.从左向右查找大于指定基数的数,找到后跳出循环执行下面if循环,交换数据
while (l < h && arr[l] <= baseNum)
l++;
//交换数据
if (l < h) {
int temp = arr[h];
arr[h] = arr[l];
arr[l] = temp;
h--;
}
}
if (l > low) {
sort(arr, low, l - 1);
}
if (h < high) {
sort(arr, l + 1, high);
}
}
输出结果:
15
17
30
46
56
82
90
95
Java中的经典算法之快速排序(Quick Sort)的更多相关文章
- Java中的经典算法之冒泡排序(Bubble Sort)
Java中的经典算法之冒泡排序(Bubble Sort) 神话丿小王子的博客主页 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一 ...
- 分享知识-快乐自己:Java中的经典算法之冒泡排序(Bubble Sort)
原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数,将 ...
- Java中的经典算法之选择排序(SelectionSort)
Java中的经典算法之选择排序(SelectionSort) 神话丿小王子的博客主页 a) 原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕.也就是:每一趟 ...
- 基础排序算法之快速排序(Quick Sort)
快速排序(Quick Sort)同样是使用了分治法的思想,相比于其他的排序方法,它所用到的空间更少,因为其可以实现原地排序.同时如果随机选取中心枢(pivot),它也是一个随机算法.最重要的是,快速排 ...
- Java中的经典算法之冒泡排序
原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数,将 ...
- 基础算法之快速排序Quick Sort
原理 快速排序(Quicksort)是对冒泡排序的一种改进. 从数列中挑出一个元素,称为"基准"(pivot); 排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的 ...
- Java中的排序算法(2)
Java中的排序算法(2) * 快速排序 * 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists). * 步骤为: * 1. 从数 ...
- [算法] 快速排序 Quick Sort
快速排序(Quick Sort)使用分治法策略. 它的基本思想是:选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分:其中一部分的所有数据都比另外一部分的所有数据都要小.然后,再按此方法对这 ...
- Java中的查找算法之顺序查找(Sequential Search)
Java中的查找算法之顺序查找(Sequential Search) 神话丿小王子的博客主页 a) 原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数 ...
随机推荐
- python解析本地HTML文件
Python使用爬虫技术时,每运行一次,本地都会访问一次主机.为避免完成程序前调试时多次访问主机增加主机负荷,我们可以在编写程序前将网页源代码存在本地,调试时访问本地文件即可.现在我来分享一下爬取资料 ...
- 如何在Java中编写一个线程安全的方法?
线程安全总是与多线程有关的,即一个线程访问或维护数据时遭到了其它线程的“破坏”,为了不被破坏,就要保持所维护变量的原子性: 1 局部变量总是线程安全的,因为每个线程都有自己的栈,而在方法中声明的变量都 ...
- oracle 存储过程详细介绍(创建,删除存储过程,参数传递等)
这篇文章主要介绍了oracle 创建,删除存储过程,参数传递,创建,删除存储函数,存储过程和函数的查看,包,系统包等相关资料,需要的朋友可以参考下 oracle 创建,删除存储过程,参数传递,创建 ...
- Error: python-devel conflicts with python-2.7.5-68.el7.x86_64
yum install yum-utils -y package-cleanup --cleandupes yum -y install python-devel yum -y install pyt ...
- Go资源被墙最快解决方案
原文链接:https://juejin.im/post/5cd945946fb9a032060c47a3,补充,最新的1.13版本go里默认就是用go module,直接设置代理即可: 注:如果没法升 ...
- 关于Python编码这一篇文章就够了
概述 在使用Python或者其他的编程语言,都会多多少少遇到编码错误,处理起来非常痛苦.在Stack Overflow和其他的编程问答网站上,UnicodeDecodeError和UnicodeEnc ...
- Asp.Net进阶/管家模式+发布订阅模式:练习
现在需要实现一个需求:我需要在一个窗体中发送一个信息,其余几个窗体都能同时接收到发送的消息. 1.界面:一个管家窗体,1个主窗体,2个订阅者窗体.其中管家窗体为启动窗体. 2.订阅:2个订阅窗体订阅主 ...
- 骨骼蒙皮动画(SkinnedMesh)
骨骼蒙皮动画也就是SkinnedMesh,应该是目前用的最多的3D模型动画了.因为他可以解决关节动画的裂缝问题,而且原理简单,效果出色,所以今天详细的谈一下骨骼蒙皮动画的相关知识. 关节动画中使用的是 ...
- NoSql 使用小结
NoSql 使用小结 足够的冗余 如果出现要拿某个 id 去查另外的 collection 的情况,说明应该往这个增加所要查询的字段 实在要做关联查询的话,是不是应该考虑关系型的数据库,关系和非关系混 ...
- 爬虫request库规则与实例
Request库的7个主要方法: requests.request(method,url,**kwargs) method:请求方式,对应get/put/post等7种: r = reques ...