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) 原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数 ...
随机推荐
- WebException 请求被中止: 操作超时
HTTP 请求时出现 :WebException 请求被中止: 操作超时 处理HTTP请求的服务器 CPU 100% ,重启后正常.
- 欧姆龙PLC_CP1H_CRC校验
1.简介 欧姆龙CP1H PLC的CRC校验.CP1H没有CRC校验指令或者功能块,在串口自由协议通信中,如果涉及到CRC校验,需要手动计算CRC值,本程序是一个输入数据,自动计算CRC校验码的程序. ...
- 窗口、消息查看分析利器Spy++
Spy++ —— 窗口.消息查看分析利器 Spy++ —— 窗口.消息查看分析利器 2016年07月15日 00:25:22 阅读数:23170 1,简介 Microsoft Spy++是一个非常 ...
- idea创建自定义代码块
1.File——>settings 2.找到Editor——>live Templates,点击加号+ 3.创建group或直接创建,我这里创建了一个user组,然后在user组里面添加l ...
- python glob删除目录下的文件
使用glob匹配目录下的文件 import os import glob path="./" for infile in glob.glob(os.path.join(path,& ...
- Go资源被墙最快解决方案
原文链接:https://juejin.im/post/5cd945946fb9a032060c47a3,补充,最新的1.13版本go里默认就是用go module,直接设置代理即可: 注:如果没法升 ...
- java8中常用的新功能
Lambda表达式的用法,并行流.Optional.循环.线程池等
- 十分钟快速入门 Python,看完即会,不用收藏!
本文以 Eric Matthes 的<Python编程:从入门到实践>为基础,以有一定其他语言经验的程序员视角,对书中内容提炼总结,化繁为简,将这本书的精髓融合成一篇10分钟能读完的文章. ...
- Android持久化存储——(包含操作SQLite数据库)
<第一行代码>读书手札 你可能会遇到的问题:解决File Explorer 中无显示问题 Android中,持久化存储,常见的一共有三种方法实现 (一.)利用文件存储 文件存储是Andro ...
- MATLAB 提取图片中的曲线数据重新画图
注意: 本代码是由[MATLAB R2015b win 32位]编写. 先上代码: %% 清空变量 clear all; clc; %% 取点之后趋势是对的,也就是点与点之间的比例是对的,但是每个点的 ...