DAY37 shell 数组排序算法

149 阅读4分钟

2、冒泡排序

类似气泡上涌的动作,会将数据在数组中从小到大或者从大到小不断的向前移动。

基本思想:

  • 冒泡排序的基本思想是对比相邻的两个元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把大的元素移动到数组后面(也就是交换两个元素的位置),这样较小的元素就像气泡一样从底部上升到顶部。

算法思路:

  • 冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,一 般为要排序的数组长度减1次,因为最后一 次循环只剩下一-个数组元素,不需要对比,同时数组已经完成排序了。而内部循环主要用于对比数组中每个相邻元素的大小,以确定是否交换位置,对比和交换次数随排序轮数而减少。

image.png

第一轮比较5次(数组长度减1),可以确定最后1个元素(元素下标值:数组长度减1)。  

​  第二轮比较4次(数组长度减2),可以确定倒数第2个元素(元素下标值:数组长度减2)。

​  第三轮比较3次(数组长度减3),可以确定倒数第3个元素(元素下标值:数组长度减3)。

​  第四轮比较2次(数组长度减4),可以确定倒数第4个元素(元素下标值:数组长度减4)。

​  第五轮比较1次(数组长度减5),可以确定倒数第5个元素(元素下标值:数组长度减5)。

​  #排序的轮数=数组长度减1  #每轮比较的次数=数组长度减轮数  #每轮确定的元素,其下标值=数组长度减轮数 

 ​  #外层循环:比较的轮数。一共比较几轮。  #内层循环:比较的方法。

将指定数组重新排序

image.png

image.png

直接选择排序

与冒泡排序相比,直接选择排序的交换次数更少,所以速度会快些。

基本思想:

  • 将指定排序位置与其它数组元素分别对比,如果满足条件就交换元素值,注意这里区别冒泡排序,不是交换相邻元素,而是把满足条件的元素与指定的排序位置交换(如从最后一个元素开始排序),这样排序好的位置逐渐扩大,最后整个数组都成为已排序好的格式。

直接选择排序的算法逻辑:

3直接选择排序1.png

第一轮:假设当前下标为0的元素值是最大的,依次和右边对比,哪个值更大就继续往后面对比,最后将最大的值放在最后一个元素的位置。

第二轮:假设当前下标为0的元素值是第二大的(即应该放到倒数第二的位置),依次和右边对比,哪个值更大就继续往后面对比,最后将最大的值放在倒数第二个元素的位置。

第三轮:以此类推。

#如果元素有6个,只需要比较5轮:  ​

第一轮:确定下标值为数组长度减1的元素。length-1  ​

第二轮:确定下标值为数组长度减2的元素。length-2  ​

第三轮:确定下标值为数组长度减3的元素。length-3  ​

第四轮:确定下标值为数组长度减4的元素。length-4  ​

第五轮:确定下标值为数组长度减4的元素。length-5  ​  ​

#排序的轮数=数组长度减1。

#每一轮的最后一个元素位置下标=数组长度 - 轮数。

image.png

image.png

反转排序

以相反的顺序把原有数组的内容重新排序。

基本思想:

  • 把数组最后一个元素与第一个元素进行交换,倒数第二个元素与第二个元素进行交换,以此类推,直到把所有数组元素反转替换。

image.png

image.png

升序排序

升序排列与降序排列的区别在于数据的排列方式不同,他们在数值型数据、字母型数据和时间型数据上的排列方式都有所不同,具体见下:

1、对于数值型数据而言,升序排列是把数据从小到大进行排列,而降序排列是把数据从大到小进行排列。比如,对于一组数据“1、3、2、5、4”而言,进行升序排列的话,这组数就会变成“1、2、3、4、5”,而降序排列的话则是“5、4、3、2、1”。

image.png

image.png