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)的更多相关文章

  1. Java中的经典算法之冒泡排序(Bubble Sort)

    Java中的经典算法之冒泡排序(Bubble Sort) 神话丿小王子的博客主页 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一 ...

  2. 分享知识-快乐自己:Java中的经典算法之冒泡排序(Bubble Sort)

    原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数,将 ...

  3. Java中的经典算法之选择排序(SelectionSort)

    Java中的经典算法之选择排序(SelectionSort) 神话丿小王子的博客主页 a) 原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕.也就是:每一趟 ...

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

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

  5. Java中的经典算法之冒泡排序

    原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数,将 ...

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

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

  7. Java中的排序算法(2)

    Java中的排序算法(2) * 快速排序 * 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists). * 步骤为: * 1. 从数 ...

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

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

  9. Java中的查找算法之顺序查找(Sequential Search)

    Java中的查找算法之顺序查找(Sequential Search) 神话丿小王子的博客主页 a) 原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数 ...

随机推荐

  1. Brave浏览器

    Brave是基于Chromium的开源Web浏览器,具有更快的页面加载速度,并且默认情况下会阻止广告和跟踪器.整合了一些其它浏览器所没有的功能,其中包括被称为 Basic Attention Toke ...

  2. python实践项目二:列表转字符串

    将列表各元素转换为字符串并以规定形式返回. 假定有下面这样的列表:spam = ['apples', 'bananas', 'tofu', 'cats'],将其转换成字符串:'apples, bana ...

  3. Python学习路线2019升级版(课程大纲+视频教程+网盘资源下载)

    2019最新Python全栈+人工智能学习路线升级版 全面涵盖前端.后端.爬虫.数据挖掘.人工智能等课程(课程大纲+视频教程+网盘资源下载)! 学习路线四大亮点: 1.人工智能三大主流框架全覆盖 2. ...

  4. PB计算两个日期相差月份(计算工龄)

    ll_intime_y = year(date(this.object.in_factory_day[row])) ll_intime_m = month(date(this.object.in_fa ...

  5. Java连接Jira,创建、修改、删除工单信息

    还不了解Jira是什么的同学可以看一下这篇文章:https://www.cnblogs.com/wgblog-code/p/11750767.html 本篇文章主要介绍如何使用Java操作Jira,包 ...

  6. ASP.net Web API综合示例

    目录 概述 功能介绍 程序结构 服务器端介绍 客户端介绍 “契约” Web API设计规则 并行写入冲突与时间戳 身份验证详解 Web API验证规则 客户端MVVM简介 Web.Config 本DE ...

  7. Consul作为SpringCloud配置中心

    一.背景介绍 在分布式系统中动态配置中,可以避免重复重启服务,动态更改服务参数等.一句话非常重要. 另外一篇文章也是这样说的,哈哈. Consul 作为Spring 推荐的分布式调度系统其也具备配置中 ...

  8. redis原理及集群主从配置

    一.简介 存储系统背景 存储系统有三类: RDBMS oracle,dh2,postgresql,mysql,sql server NoSQL: KV NoSQL:redis,memcached 列式 ...

  9. Spring AOP 多个切点实现:JdkDynamicAopProxy

    Spring Aop 的底层生成代理类i的实现除 jdk的动态代理技术外,还用到了Cglib,不过在封装两者的设计原理上相差不大,只是底层工具不同而已. 本文只分析JdkDynamicAopProxy ...

  10. winform 替换word文档中的字段(包含图片添加),生成导出PDF文件(也可是word文件)

    1.先打开你需要替换的word文档,在想要后续更换字段值的地方添加“书签”. 2.将模板文档存放在 程序的Debug文件下. 3.生成文件的按钮点击事件 代码: string templatePath ...