在理论开发中,有很多场景须要咱们将数组元素依照从大到小(或者从小到大)的顺序排列,这样在查阅数据时会更加直观,例如:
一个保留了班级学号的数组,排序后更容易分区好学生和坏学生;
一个保留了商品单价的数组,排序后更容易看出它们的性价比。
对数组元素进行排序的办法有很多种,比方冒泡排序、归并排序、抉择排序、插入排序、疾速排序等,其中最经典最须要把握的是「冒泡排序」。
以从小到大排序为例,冒泡排序的整体思维是这样的:
从数组头部开始,一直比拟相邻的两个元素的大小,让较大的元素逐步往后挪动(替换两个元素的值),直到数组的开端。通过第一轮的比拟,就能够找到最大的元素,并将它挪动到最初一个地位。
第一轮完结后,持续第二轮。依然从数组头部开始比拟,让较大的元素逐步往后挪动,直到数组的倒数第二个元素为止。通过第二轮的比拟,就能够找到次大的元素,并将它放到倒数第二个地位。
以此类推,进行 n-1(n 为数组长度)轮“冒泡”后,就能够将所有的元素都排列好。
整个排序过程就如同气泡一直从水里冒出来,最大的先进去,次大的第二进去,最小的最初进去,所以将这种排序形式称为冒泡排序(Bubble Sort)。
上面咱们以“3 2 4 1”为例对冒泡排序进行阐明。
第一轮 排序过程
3 2 4 1(最后)
2 3 4 1(比拟 3 和 2,替换)
2 3 4 1(比拟 3 和 4,不替换)
2 3 1 4(比拟 4 和 1,替换)
第一轮完结,最大的数字 4 曾经在最初面,因而第二轮排序只须要对后面三个数进行比拟。
第二轮 排序过程
2 3 1 4(第一轮排序后果)
2 3 1 4(比拟 2 和 3,不替换)
2 1 3 4(比拟 3 和 1,替换)
第二轮完结,次大的数字 3 曾经排在倒数第二个地位,所以第三轮只须要比拟前两个元素。
第三轮 排序过程
2 1 3 4(第二轮排序后果)
1 2 3 4(比拟 2 和 1,替换)
至此,排序完结。
算法总结及实现
对领有 n 个元素的数组 R[n] 进行 n-1 轮比拟。
第一轮,一一比拟 (R[1], R[2]), (R[2], R[3]), (R[3], R[4]), ……. (R[N-1], R[N]),最大的元素被挪动到 R[n] 上。
第二轮,一一比拟 (R[1], R[2]), (R[2], R[3]), (R[3], R[4]), ……. (R[N-2], R[N-1]),次大的元素被挪动到 R[n-1] 上。
。。。。。。
以此类推,直到整个数组从小到大排序。
优化算法
下面的算法是大部分教材中提供的算法,其中有一点是能够优化的:当比拟到第 i 轮的时候,如果剩下的元素曾经排序好了,那么就不必再持续比拟了,跳出循环即可,这样就缩小了比拟的次数,进步了执行效率。
未经优化的算法肯定会进行 n-1 轮比拟,通过优化的算法最多进行 n-1 轮比拟,高下立判。