java中sort是快速排序,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中的经典算法之冒泡排序&lpar;Bubble Sort&rpar;

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

分享知识-快乐自己:Java中的经典算法之冒泡排序&lpar;Bubble Sort&rpar;

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

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

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

基础排序算法之快速排序&lpar;Quick Sort&rpar;

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

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

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

基础算法之快速排序Quick Sort

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

Java中的排序算法(2)

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

&lbrack;算法&rsqb; 快速排序 Quick Sort

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

Java中的查找算法之顺序查找&lpar;Sequential Search&rpar;

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

随机推荐

linux&plus;apache url大小写敏感问题

Linux对文件目录大小写敏感,URL大小写敏感会导致网页打不开,解决方法之一是启用Apache的mod_speling.so模块. 1.确认/usr/lib/httpd/modules目录下是否存在 ...

菜鸟写的第一个chrome插件

一.新建一个文件夹,用来放插件的代码 二.首先新建配置文件manifest.json // 开发参考:http://open.chrome.360.cn/extension_dev/overview. ...

Swift - 加速传感器(CoreMotion)的用法,小球加速运动并反弹样例

1,加速传感器可以监听到x,y,z三个方向的加速度,使用步骤如下: (1)实例化CMMotionManager类 (2)向CMMotionManager的accelerometerUpdateInte ...

Greenplum扩容

Greenplum支持原有主机扩展Segment个数.新增主机.和混合扩展 本文以在已有机器上扩展节点为例 1.可按照hostname:address:port:fselocation:dbid:co ...

ovs-qos配置

QoS配置 在许多网络场景中,都需要根据需求对网络流量部署服务质量(QoS)保障策略,比如限制指定主机的最大接入带宽等需求.本节将介绍如何在OVS上添加队列,并完成数据的入队操作,从而完成QoS策略部 ...

使用Phoenix通过sql语句更新操作hbase数据

hbase 提供很方便的shell脚本,可以对数据表进行 CURD 操作,但是毕竟是有一定的学习成本的,基本上对于开发来讲,sql 语句都是看家本领,那么,有没有一种方法可以把 sql 语句转换成 h ...

数据库~Mysql派生表注意的几点~关于百万数据的慢查询问题

基础概念 派生表是从SELECT语句返回的虚拟表.派生表类似于临时表,但是在SELECT语句中使用派生表比临时表简单得多,因为它不需要创建临时表的步骤. 术语:*派生表*和子查询通常可互换使用.当SE ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值