raptor五个数排序流程图_看了这篇文章,我发现排序算法好简单
原创: 程序员共成长
1
插入排序
插入排序是最简单的一种排序方式。这里就不去啰嗦绕口的概念了,通过图去解释什么是插入排序
假设一个数组内有如下5个元素,需要对其按照从小到大的顺序进行排列。
插入排序就是从未排序序列中,取出元素,在已排序序列中一次比较。插入到相应的位置。
在上面的五个数字中
- 我们假设有一个长度为一的有序系列为12。
- 而8、17、31、22为无序序列。
- 从无序序列中取出一个元素8,与有序序列中的12进行比较。比12小,则将其移动到12前面,反之放在后面
结果为
依次类推,最终得到一个有序序列。这个过程称为插入排序
代码实现如下
public static void main(String[] args) {
Integer[] arr = {12, 8, 17, 31, 22};
// 第一个元素为有序,因此从i = 1开始
for (int i = 1; i < arr.length; i++) {
// 待插入元素 第一次循环arr[i] 就是8
Integer temp = arr[i];
int j;
for (j = i - 1; j >= 0; j--) {
// 数组中第二个元素与第一个元素比较,12>8
if (temp < arr[j])
/**
* 复制j位元素到j+1
* 循环一次是,结果为12、12、17、31、22
*/
arr[j + 1] = arr[j];
else
break;
}
/**
* j + 1 位为要插入的最小元素
* 循环一次结果为8、12、17、31、22
*/
arr[j + 1] = temp;
}
System.out.println(Arrays.toString(arr));
}
2
二分排序
在说二分排序之前不得不提到二分查找这个基本的算法。那什么是二分查找呢?
举个例子,大家应该都玩过猜数字的游戏,如果从1~100这里面猜一个数字。我只需要对你猜的数字回答 “大了”、“小了”。直至猜出结果。
如果漫无目的的去猜,运气不好可能会猜100次。那怎么样才能更少次数的猜出结果呢。
假设我们的目标数字是 66
我猜数字是 50
小了
那75呢?
又大了
嗯,那我猜50和75的中间数63!
这次小了
那继续63和75的中间数 69 ~!
大啦大啦
那63和69的中间数 66呢?
哈哈,终于被你才出来了。
二分大法果然好,五次就猜出来了
●●●
对于N个元素的列表,我们要猜出其中一个数字最多只需要log 2 N次。如果列表中1024个数字,我们也只需要猜测10次就可以出来。2的十次方等于1024.
回到我们的二分插入,原理基本一样,从无序列表中取出一个元素,跟前面的有序列表的中间数进行比较,如果小了,再进行折半比较,直至找到合适的位置。
如图,6、9、12、18、20为有序列表,对15进行二分插入
- 取出有序列表的中间元素12。12< 15。
- 12、18、20取出中间元素,18。18 > 15
- 在12、18中进行比较,12<15<18
public static void main(String[] args) {
int i, j, right, left, mid, temp;
Integer[] arr = {12, 8, 17, 31, 22, 44, 1, 99, 76};
// 依旧把第一个元素当成有序的,因此从i=1开始
for (i = 1; i < arr.length; i++) {
//如果后一个元素比前一个元素大,则continue,开始下一次循环
if (arr[i] > arr[i - 1]) {
continue;
}
temp = arr[i];
//最左边为二分插入的起始位置
left = 0;
//左右定义有序列表的长度
right = i-1;
while (left <= right) {
//mid为中间元素的下标
mid = (left + right) / 2;
// 中间元素和要插入的元素进行比较
if (arr[mid] < temp)
//如果中间元素小,则起始位置为mid + 1
left = mid + 1;
else
//同left
right = mid - 1;
}
// 移动元素到相应的位置
for (j = i - 1; j >= left; j--) {
arr[j + 1] = arr[j];
}
arr[left] = temp;
}
System.out.println(Arrays.toString(arr));
}
3
希尔排序
希尔排序又成为缩小增量排序。假设有一个长度为N的数组,他的增量设为X(X
如图,一个长度为6的无序数组
增量通常取长度的一般,所以增量为 6/2 = 4。意味着此时被拆分为3个子序列。
[18 , 10], [22,1],[3,19],[51,55]
我用三种不同的颜色进行标识
然后子序列中的元素进行插入排序,即同一颜色的两个数进行排序,结果为
然后缩小增量,此时增量为4/2 = 2。被分为两个子序列
[10,3,18,19] ,[1,5 1,22,55]
再次对子序列进行排序,得到的结果如下
重复上述操作,再次缩小增量直至为1,经过增量递减的过程,其实就是元素排序的过程,当增量为1时,大部分元素其实已经排好顺序了,我们只需要对其进行微调即可。
代码实现如下
public static void main(String[] args) {
Integer[] arr = {18, 22, 3, 51, 10, 1, 19, 55};
// 初始增量通常为总长度的一半
int mid = arr.length / 2;
int i;
while (mid > 0) {
for (i = mid; i < arr.length; i++) {
// 起始下标
int begin = i - mid;
int tmp = arr[i];
// 起始下标元素大 则调整位置,
while (begin >= 0 && arr[begin] > arr[i]) {
arr[begin + mid] = arr[begin];
begin -= mid;
}
//并且调换位置
arr[begin + mid] = tmp;
}
// 每次结束,增量缩小一半。也可以自定义
mid = mid / 2;
System.out.println(Arrays.toString(arr));
}
}
4
总结
插入排序适用于少量数据的排序,其时间复杂度为O(n^2)。
二分排序则是利用了数组能够快速定位的特点,时间复杂度也是O(n^2),适用于较大数据排序
希尔排序的实质是分组再进行直接插入,开始时增量较大时,插入排序的数量少,所以前期会很快。当增量变小时,数据也基本有序了。所以希尔排序的时间复杂度要比O(n^2)要好很多。
raptor五个数排序流程图_看了这篇文章,我发现排序算法好简单相关推荐
- c语言乘法口诀表的流程图_看了100篇化妆教程,还没有这60句化妆口诀管用
如果把化妆技巧整理成像乘法口诀一样,大家会不会觉得化妆这件事变得容易了一些? Zoya好像已经很久没写过化妆技巧教程了吧!但事实上,关于脸上每个部位的妆容该怎么画,早在之前的推送中都基本已经讲过一遍了 ...
- python 只循环目录_看完这篇文章,你的Python基础就差不多了
世界那么大,谢谢你来看我!!关注我你就是个网络.电脑.手机小达人 前言 本文是基于黑马程序员2019年的Python基础班的内容编写的,以2019年的资料为蓝本,2018年的资料为补充,还参考了一些网 ...
- python发红包最佳手气王_看完这篇文章 以后微信抢红包手气王就是我了
春节是中华民族隆重的农历新年,这是世界上规模最大的节日. 在春节前后,炎黄子孙们不远万里衣锦还乡,与亲人们团圆. 在此期间,中国的铁路上会发生,地球上最大规模的人口迁徙. 作为世界上最能吃最能玩的种族 ...
- logback property 默认值_看完这篇文章还不会给spring boot配置logback,请你吃瓜
每一个成功人士的背后,必定曾经做出过勇敢而又孤独的决定. 放弃不难,但坚持很酷~ 一.logback日志框架 logback 是一个开源的日志组件,由三个部分组成:logback-core,logba ...
- controller requestparam不传参数空指针异常_看完这篇文章,让你轻松学会Java异常处理...
一.背景 最近专门负责团队的项目质量.我在治理异常日志过程中,总结了一下Java的异常处理.上面是我整理的最近自己比较常见的异常知识地图. 二.异常知识地图概述 从异常知识地图最左边的根开始看,地图从 ...
- 电脑位数怎么看_看完了这篇文章你就知道怎么选电脑了...
电脑成为人们日常生活中.工作中不可或缺的一部分,很多朋友都不了解电脑怎么买,怎么选择才好. 选购电脑重要的几点: ①预算(千百块有千百块的电脑,三五千有三五千的电脑,七八千有七八千的电脑) ②用途(不 ...
- 苹果地图副总裁_看完这篇文章 或许你会再给“苹果地图”一次机会
地图 4 岁了. 苹果负责互联网服务和软件的高管 Eddy Cue 和 Craig Federighi,受访畅谈地图业务"得失"的机会并不多.采访实录还没看完,我抓起 iPhone ...
- american主板网卡灯关机后还亮_看完这篇文章,90%的电脑黑屏问题都可以解决了!...
经常有朋友电脑一开机,发现电脑黑屏没法用了.这是什么情况?该怎么处理?很多人看到黑屏就懵了,以为电脑要报废了,别方,下面蝈蝈来给大家讲讲常见的黑屏问题的解决办法,希望对您有所帮助! 一般常说的黑屏故障 ...
- 抖音的标题写什么内容_看了这篇文章,我才真正明白什么才是英语速成之路!感恩...
英语的重要性,毋庸置疑!尤其对广大职场人士,掌握英语意味着就多了一项竞争的技能.那,对于我们成人来说,时间是最宝贵的.如何短时间内在英语方面有所突破,这是我们最关心的事情.英语学习,到底有没有捷径可以 ...
最新文章
- C#获取邮件客户端保存的邮箱密码
- 简单实现Dedecms RSS全站输出
- Angular property binding重复触发的问题讨论
- SAP Gateway service language determination
- windows 禁用ipv6服务_Win10如何关闭IPV6?Win10禁用IPv6的方法
- 最长回文子串——Manacher 算法​​​​​​​
- insert_text
- K近邻模型(k-NN)
- 断网会导致xml加载失败数据库失败,识别不了,mybatis官网
- 数据库系统概念第四章习题答案
- 约瑟夫问题的数学解法
- for循环2000年到3000年的闰年
- 干草堆——acwing算法题第二天
- 通达oa mysql连接_安装通达OA后想使用其自带的Mysql数据库的解决方法
- 朴素贝叶斯文本分类(python代码实现)
- Chrome 89 新功能一览,性能提升明显,大量 DevTools 新特性!
- 听见丨前谷歌无人车负责人联手大众和现代 开发自动驾驶 自动驾驶技术研发公司AImotive获3800万美元C轮融资
- 【2022HVV系列】蓝队手册更新版(建议收藏)
- c语言调用鼠标驱动函数,鼠标驱动程序
- 如何快速实现离散企业全链路数字化管理?
热门文章
- CoffeeScript、TypeScript 、 JavaScript 之间
- 常用的JDBC的驱动
- idea设置提示重复代码下去掉波浪线
- 学校运动会广播稿计算机,学校运动会广播稿【五篇】
- html打印日志_Graylog(四)使用Log4j2发送日志到Graylog
- linux bash 删除所有空格,删除字符串中的所有的空白并用空格分割单词.md
- python time sleep 阻塞 异步_Python Tornado异步请求被阻塞
- 7、菜单栏、工具栏、状态栏、浮动窗口、TextEdit
- python-threading.Event实现事件功能--汽车过红绿灯(转载)
- MVC 使用 Ueditor富文本编辑器