※交换排序(1)——快速排序(quick sort)

快速排序使用分治策略(Divide and Conquer)来把一个序列分为两个子序列。步骤为:
从序列中挑出一个元素,作为"基准"(pivot).
把所有比基准值小的元素放在基准前面,所有比基准值大的元素放在基准的后面(相同的数可以到任一边),这个称为分区(partition)操作。
对每个分区递归地进行步骤1~3,递归的结束条件是序列的大小是0或1,这时整体已经被排好序了。
快速排序是对冒泡排序的一种改进!

快速排序的代码如下:

public static void quickSort(int[] numbers,int low,int high) {if(low < high) {int middle = getMiddle(numbers,low,high); quickSort(numbers, low, middle-1);   quickSort(numbers, middle+1, high); }} public static int getMiddle(int[] numbers, int low,int high)  {int temp = numbers[low];         while(low < high){//高位判断 while (low < high && numbers[high] > temp) {high--;}numbers[low] = numbers[high]; //  否则情况 numbers[high] > temp 交换位置//低位判断while (low < high && numbers[low] < temp) {low++;}numbers[high] = numbers[low]; // 否则情况 numbers[low] > temp 交换位置}numbers[low] = temp ; return low ;} 

备注:
可以采用空位法来梳理整个过程:
比如数组ss:{4,5,7,8,6,3}
temp = ss[0] = 4 ;
排序开始可以认为数组为:{[],5,7,8,6,3} 首位被空出来,以空位代替。
1)与高位比较,有两种情况:
1.比较位上的数比temp大
此时符合数组比较规律,则数组下标自减。
2.比较位上的数比temp小
则将比较位上的数放入空位。
由于 temp =4 > ss[5] =3,将 ss[5] 放入空位,于是数组变成:{3,5,7,8,6,[]},可以认为被交换位置 ss[5] 被空出来。

2)与低位比较,也有两种情况:与高位类似。
1.比较位上的数比temp小
此时符合数组比较规律,则数组下标自增。
由于ss[0] = 3 < temp = 4 ,数组下标自增1,到ss[1],{3,5,7,8,6,[]},此时ss[1] = 5 > temp =4不再符合该判断条件!
2.比较位上的数比temp大
则将比较位上的数放入空位。
由于 ss[1] = 5 > temp =4, 则将ss[1]放入空位。此时的数组排列为:{3,[],7,8,6,5}。

在大while循环条件下,重复以上操作!最终的数组排列为:{3,[],7,8,6,5}。
将temp的值注入其中的空位,数组的排列为:{3,4,7,8,6,5}。
递归以上,可以将之看做为:{3},4,{7,8,6,5}
可得到最终排序结果。

扩展:关于快速排序与归并排序之比较?
归并排序和快速排序都使用了分治法。
对于归并排序,大量的工作是将两个子线性表进行归并,归并是在子线性表都排好序之后进行的。
对于快速排序,大量的工作是将线性表划分为两个子线性表,划分是在子线性表排好序前进行的。
在最差情况下,归并排序的效率高于快速排序,但是,在平均情况下,两者效率相同O(NlogN)。
归并排序在归并两个子数组时,需要一个临时数组,而快速排序不需要额外的数组控件,因此,快速排序的空间效率高于归并排序。

参考文章:http://blog.csdn.net/morewindows/article/details/6684558

end

转载于:https://www.cnblogs.com/understander/p/6686372.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/416949.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端学习(2365):图片的预览

message.vue <template><view><button type"primary" click"chooseImg">上传图片</button><image v-for"item in imgArr" :src"item" click"previewImg(item)"></image></view>…

superset 图标调整

superset docker方式安装 系统为debian 9 安装路径为 /usr/local/lib/python3.6/site-packages/superset/ web页面左上角图标路径为&#xff1a; static/assets/images/superset-logo2x.png 采用Flask框架 页面在views/中&#xff0c;core.py中 #欢迎页面 expose(/welco…

第五周思维导图

转载于:https://www.cnblogs.com/java1765415329/p/6686733.html

superset 时区问题Timestamp subtraction must have the same timezones or no timezones

superset绑定数据源后&#xff0c;切换到图表展示时报错&#xff1a; Timestamp subtraction must have the same timezones or no timezones File "/usr/local/lib/python3.6/site-packages/superset/utils/core.py", line 362, in datetime_to_epoch return (dtt…

使用Kotlin开发Android应用 - 环境搭建 (1)

一. 在Android Studio上安装Kotlin插件 按快捷键Command, -> 在Preferences界面找到Plugins -> 点击Browse repositories ... -> 输入Kotlin -> 安装Kotlin (老版本需要安装 Kotlin 和Kotlin Extensions For Android两个插件, 最新版本的Kotlin插件包含了Android E…

前端学习(2367):两种方式导航跳转和传参

<template><view><button type"primary" click"chooseImg">上传图片</button><image v-for"item in imgArr" :src"item" click"previewImg(item)"></image><navigator url"../…

sqlserver启用登陆审计

客户端管理工具进入后&#xff1a;安全性——审核——新建审核——审核目标&#xff08;就是存储位置&#xff09;选application log&#xff08;windows系统应用日志&#xff09;或者选File&#xff08;文件目录中会产生一堆日志文件&#xff0c;设置最大滚动更新文件数、最大…

java基础——equals及==的区别

①数值比较【必须为整数&#xff0c;小数因为精度问题不能通过这个比较&#xff0c;只能依靠d1-d2<0.0000000001这样的比较两者的不同】&#xff0c;值相等就行。 ②引用比较&#xff0c;引用的对象有父子关系或者是同一类的才能比较&#xff0c;只有当指向同一个引用才相等…

前端学习(2368):编程式导航

<template><view><button type"primary" click"chooseImg">上传图片</button><image v-for"item in imgArr" :src"item" click"previewImg(item)"></image><navigator url"../…

centos7 firewall防火墙实现映射其他机器的端口

vi /etc/sysctl.conf 增加一行 net.ipv4.ip_forward 1 使上述修改生效 sysctl -p firewall-cmd --add-port5432/tcp --permanent #开放端口 firewall-cmd --add-forward-portport5432:prototcp:toaddr10.0.197.189:toport5432 --permanent #添加端口映射 10.0.197.189的54…

Navicat Premium 未保存和已执行SQL存储位置

未保存备份存放目录地址&#xff1a; C:\Users\{登录用户名}\Documents\Navicat\MySQL\servers\{MySQL连接名称}\{数据库名称} SQL执行历史文件地址&#xff1a; C:\Users\{登录用户名}\Documents\Navicat\Premium\logs\LogHistory.txt

正则表达式之反向引用

1.概述 捕获组捕获到的内容&#xff0c;不仅可以在正则表达式外部通过程序进行引用&#xff0c;也可以在正则表达式内部进行引用&#xff0c;这种引用方式就是反向引用。要了解反向引用&#xff0c;首先要了解捕获组&#xff0c;关于捕获组&#xff0c;参考 正则基础之——捕获…

MySQL 表一列逗号分隔字段,按逗号切割

直接查询 ---切割前 select id,content from test_split; 1 12,13,14 2 21,25 3 33 --切割后 1 12 1 13 1 14 2 21 2 25 3 33 --执行sql SELECT a.id,SUBSTRING_INDEX(SUBSTRING_INDEX(a.content,,,b.help_topic_id1),,,-1) AS num FROM test_split a join mys…

jquery template.js前端模板引擎

作为现代应用&#xff0c;ajax的大量使用&#xff0c;使得前端工程师们日常的开发少不了拼装模板&#xff0c;渲染模板 在刚有web的时候&#xff0c;前端与后端的交互&#xff0c;非常直白&#xff0c;浏览器端发出URL&#xff0c;后端返回一张拼好了的HTML串。浏览器对其进行渲…

webflux databuffer输出

直接输出JSON对象 GetMapping("selectMy") public Mono<Void> selectMy(ServerHttpRequest request, ServerHttpResponse response) {String pageNumber request.getQueryParams().getFirst("pageNumber");AuthUser authUser LoginProcess.getCurr…

Debug Hook

命名 关于这个命名是我自己这样说的&#xff0c;至于这种HOOK技术&#xff0c;先前在一个开源项目中叫做RemoteHook&#xff0c;我比较喜欢自己的这种命名&#xff0c;所以就叫Debug Hook。如果有错误&#xff0c;请指出。 先来说说调试的原理 在Windows操作系统&#xff0c;有…