排序算法--【插入排序】具体过程解析

8大排序-插入排序
arr = [1,22,-1,9,23,5]
将一个数字插入到有序数组,对比=》找到插入位置=》插入
1,2,4,5 =====3 ====>1,2,3,4,5
----------------------------------------
arr = [1,22,-1,9,23,5]
1.将数组分成两部分
-有序部分[1]
-无序部分[22,-1,9,23,5]
2. 取无序部分的第一个元素插入到有序部分去
-有序部分[1,22]
-无序部分[-1,9,23,5]
-------------------------
重复步骤2
-有序部分[-1,1,22]
-无序部分[9,23,5]
重复步骤2
-有序部分[-1,1,9,22]
-无序部分[23,5]
重复步骤2
-有序部分[-1,1,9,22,23]
-无序部分[5]
重复步骤2
-有序部分[-1,1,5,9,22,23]
-无序部分[]
----------------------------------------
具体的插入过程1:
1,2,4,5==>插入3
arr = [1,2,4,5,3]
==3<5:交换3,5的位置=》[1,2,4,3,5]
[1,2,4,3,5]
==3<4:交换3,4的位置=》[1,2,3,4,5]
[1,2,3,4,5]
==3>2====3肯定大于2之前的数,所以停止比较

----------------------------------------
具体的插入过程2:
1,2,4,5==>插入3
arr = [1,2,4,5,3]
首先用一个临时变量记录待插入的元素的值
temp = arr[i] 然后我们开始比较temp和arr[3],arr[2],arr[1]...的大小
比较后做什么操作?
if temp<要比较的元素(来源有序序列)
将比较元素往后挪
arr[1,2,4,5,5]
重复比较
arr[1,2,4,4,5]
开始比较2:2<temp 停止比较
temp 插入到2后面即可
arr[1,2,3,4,5]
---------------------------------------------
插入排序的稳定性:
-什么叫做稳定性,相同的元素在排序后没有发生位置的变化我们称这种排序算法为稳定排序
-插入排序算法是一种稳定的排序算法
---------------------------------------------
算法稳定性的意义:
实际工作中排序算法肯定不会根据数据一个属性的排序
双11 淘宝订单
按照付款金额和付款顺序(交易金额的前100位送优惠券)如果说有相同的金额的话按照付款时间先后来决定
a,b,c,d...第100个人和第101个人的付款时间是一样的,但是付款金额不同
1. 按照交易金额进行排序(不止100个人啊,肯定很多人啊)
2. 按照订单的时间来取前100位,(又要写一个算法去取订单时间的前100位)
这个时候如果说第100个和第101个人订单时间是一样的能交换他们的位置吗?
不能,因为我们第100个人的付款金额大于第101个付款金额,如果我们的算法不稳定,就不能实现该功能了
-------------------------------------------------
如何获取付款金额最高的前100个人付款人
1. 对所有订单按照付款金额排序
2. 取step1的排序结果按照付款时间来排序
3. 如果说相同的时间的订单,不改变其排序前后的相对位置
第 101 个订单的 付款时间00:01 付款金额97
第 99 个订单的 付款时间00:01 付款金额99
第 100 个订单的 付款时间00:01 付款金额98
这个是算法稳定性的意义
99,98,97,96对应的时间都是00:01
现在使用时间进行排序
如果按照时间排序的时候相同时间的订单顺序发生了变化,可能变成了97,96,98,99

针对相同的元素在排序后发生位置的变化我们称这种排序算法为比稳定排序

订单
属性1-金额
属性2-时间
按照属性1-金额排序的结果
订单1, 订单2, 订单3, 订单4 .。。。。

订单1 订单2的时间是一样的
按照属性2-时间排序的结果
如果是不稳定
订单2, 订单1, 订单3, 订单4 .。。。。

稳定的意义:
1、如果只是简单的进行数字的排序,那么稳定性将毫无意义。
2、如果排序的内容仅仅是一个复杂对象的某一个数字属性,那么稳定性依旧将毫无意义(所谓的交换操作的开销已经算在算法的开销内了,如果嫌弃这种开销,不如换算法好了?)
3、如果要排序的内容是一个复杂对象的多个数字属性,但是其原本的初始顺序毫无意义,那么稳定性依旧将毫无意义。
4、除非要排序的内容是一个复杂对象的多个数字属性,且其原本的初始顺序存在意义,那么我们需要在二次排序的基础上保持原有排序的意义,才需要使用到稳定性的算法,例如要排序的内容是一组原本按照价格高低排序的对象,如今需要按照销量高低排序,使用稳定性算法,可以使得想同销量的对象依旧保持着价格高低的排序展现,只有销量不同的才会重新排序。(当然,如果需求不需要保持初始的排序意义,那么使用稳定性算法依旧将毫无意义)

 

posted @ 2020-02-16 15:08  进阶的淑琴  阅读(964)  评论(0)    收藏  举报