原创: 程序员共成长

1

插入排序

插入排序是最简单的一种排序方式。这里就不去啰嗦绕口的概念了,通过图去解释什么是插入排序

假设一个数组内有如下5个元素,需要对其按照从小到大的顺序进行排列。

插入排序就是从未排序序列中,取出元素,在已排序序列中一次比较。插入到相应的位置。

在上面的五个数字中

  1. 我们假设有一个长度为一的有序系列为12。
  2. 而8、17、31、22为无序序列。
  3. 从无序序列中取出一个元素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五个数排序流程图_看了这篇文章,我发现排序算法好简单相关推荐

  1. c语言乘法口诀表的流程图_看了100篇化妆教程,还没有这60句化妆口诀管用

    如果把化妆技巧整理成像乘法口诀一样,大家会不会觉得化妆这件事变得容易了一些? Zoya好像已经很久没写过化妆技巧教程了吧!但事实上,关于脸上每个部位的妆容该怎么画,早在之前的推送中都基本已经讲过一遍了 ...

  2. python 只循环目录_看完这篇文章,你的Python基础就差不多了

    世界那么大,谢谢你来看我!!关注我你就是个网络.电脑.手机小达人 前言 本文是基于黑马程序员2019年的Python基础班的内容编写的,以2019年的资料为蓝本,2018年的资料为补充,还参考了一些网 ...

  3. python发红包最佳手气王_看完这篇文章 以后微信抢红包手气王就是我了

    春节是中华民族隆重的农历新年,这是世界上规模最大的节日. 在春节前后,炎黄子孙们不远万里衣锦还乡,与亲人们团圆. 在此期间,中国的铁路上会发生,地球上最大规模的人口迁徙. 作为世界上最能吃最能玩的种族 ...

  4. logback property 默认值_看完这篇文章还不会给spring boot配置logback,请你吃瓜

    每一个成功人士的背后,必定曾经做出过勇敢而又孤独的决定. 放弃不难,但坚持很酷~ 一.logback日志框架 logback 是一个开源的日志组件,由三个部分组成:logback-core,logba ...

  5. controller requestparam不传参数空指针异常_看完这篇文章,让你轻松学会Java异常处理...

    一.背景 最近专门负责团队的项目质量.我在治理异常日志过程中,总结了一下Java的异常处理.上面是我整理的最近自己比较常见的异常知识地图. 二.异常知识地图概述 从异常知识地图最左边的根开始看,地图从 ...

  6. 电脑位数怎么看_看完了这篇文章你就知道怎么选电脑了...

    电脑成为人们日常生活中.工作中不可或缺的一部分,很多朋友都不了解电脑怎么买,怎么选择才好. 选购电脑重要的几点: ①预算(千百块有千百块的电脑,三五千有三五千的电脑,七八千有七八千的电脑) ②用途(不 ...

  7. 苹果地图副总裁_看完这篇文章 或许你会再给“苹果地图”一次机会

    地图 4 岁了. 苹果负责互联网服务和软件的高管 Eddy Cue 和 Craig Federighi,受访畅谈地图业务"得失"的机会并不多.采访实录还没看完,我抓起 iPhone ...

  8. american主板网卡灯关机后还亮_看完这篇文章,90%的电脑黑屏问题都可以解决了!...

    经常有朋友电脑一开机,发现电脑黑屏没法用了.这是什么情况?该怎么处理?很多人看到黑屏就懵了,以为电脑要报废了,别方,下面蝈蝈来给大家讲讲常见的黑屏问题的解决办法,希望对您有所帮助! 一般常说的黑屏故障 ...

  9. 抖音的标题写什么内容_看了这篇文章,我才真正明白什么才是英语速成之路!感恩...

    英语的重要性,毋庸置疑!尤其对广大职场人士,掌握英语意味着就多了一项竞争的技能.那,对于我们成人来说,时间是最宝贵的.如何短时间内在英语方面有所突破,这是我们最关心的事情.英语学习,到底有没有捷径可以 ...

最新文章

  1. C#获取邮件客户端保存的邮箱密码
  2. 简单实现Dedecms RSS全站输出
  3. Angular property binding重复触发的问题讨论
  4. SAP Gateway service language determination
  5. windows 禁用ipv6服务_Win10如何关闭IPV6?Win10禁用IPv6的方法
  6. 最长回文子串——Manacher 算法​​​​​​​
  7. insert_text
  8. K近邻模型(k-NN)
  9. 断网会导致xml加载失败数据库失败,识别不了,mybatis官网
  10. 数据库系统概念第四章习题答案
  11. 约瑟夫问题的数学解法
  12. for循环2000年到3000年的闰年
  13. 干草堆——acwing算法题第二天
  14. 通达oa mysql连接_安装通达OA后想使用其自带的Mysql数据库的解决方法
  15. 朴素贝叶斯文本分类(python代码实现)
  16. Chrome 89 新功能一览,性能提升明显,大量 DevTools 新特性!
  17. 听见丨前谷歌无人车负责人联手大众和现代 开发自动驾驶 自动驾驶技术研发公司AImotive获3800万美元C轮融资
  18. 【2022HVV系列】蓝队手册更新版(建议收藏)
  19. c语言调用鼠标驱动函数,鼠标驱动程序
  20. 如何快速实现离散企业全链路数字化管理?

热门文章

  1. CoffeeScript、TypeScript 、 JavaScript 之间
  2. 常用的JDBC的驱动
  3. idea设置提示重复代码下去掉波浪线
  4. 学校运动会广播稿计算机,学校运动会广播稿【五篇】
  5. html打印日志_Graylog(四)使用Log4j2发送日志到Graylog
  6. linux bash 删除所有空格,删除字符串中的所有的空白并用空格分割单词.md
  7. python time sleep 阻塞 异步_Python Tornado异步请求被阻塞
  8. 7、菜单栏、工具栏、状态栏、浮动窗口、TextEdit
  9. python-threading.Event实现事件功能--汽车过红绿灯(转载)
  10. MVC 使用 Ueditor富文本编辑器