本文没有代码,而是梳理思路,便于理解记忆
总结冒泡排序,选择排序,插入排序的思路,以n个数的从小到大的排序为例
说明:
1. 这里总结的思路,都是先确定较小的数,再确定较大的数
2. 总结方式为轮数以及每轮内所完成的排序工作
3. 示意图中,圆表示数字,只用箭头表示数字之间的比较,不表示其他信息,避免信息太多(个人认为三种基础排序最典型的区别就是比较的方式不同)
1. 冒泡排序
第1轮:从第n个数到第1个数,依次两两比较并执行必要的交换,完成之后,最小数据排在第一位
第2轮:从第n个数到第2个数,依次两两比较并执行必要的交换,完成之后,第二小数据排在第二位
…
第n-1轮:从第n个数到第n-1个数,依次两两比较并执行必要的交换,完成之后,第二大数据排在倒数第二位,同时,最大数据排在最后
2. 选择排序
用一个变量记录最小数据的位置
第1轮:第1个数依次和后面的所有数比较,变量更新为最小数据的位置,然后第1个数和记录位置的数交换,完成之后,最小数据排在第一位
第2轮:第2个数依次和后面的所有数比较,变量更新为最小数据的位置,然后第2个数和记录位置的数交换,完成之后,第二小数据排在第二位
…
第n-1轮:第n-1个数和最后一个数比较,变量更新为最小数据的位置,第n-1个数和记录位置的数交换,完成之后,第二大数据排在倒数第二位,同时,最大数据排在最后
3. 插入排序
(第1个数,不操作,此时,排好了一个数(相对位置))
第1轮:第2个数,和第1个数比较,如果比第1个数小,则第1个数顺移到第二位,第2个数插入(放到)第一位,完成之后,排好了两个数(相对位置)
…
第n-1轮:第n个数和第n-1个数比较,如果第n个数小于第n-1个数,按照末尾至开头的方向,依次比较第n个数和位置[1, n-1]之间的数,直到出现小于等于第n个数的位置t,则位置[t+1, n-1]的所有数顺移一位,变成位置[t+2, n]的数,第n个数插入(放到)位置t+1,完成之后,排好了n个数(相对位置,对于第n-1轮来说,同时也是绝对位置)
这里,每一轮的比较对象是一个数和这个数之前的所有数形成的整体,这个整体里的数已经完成排序。每一轮里,具体比较的次数不定,和数的相对大小有关。
一句话总结思路:(便于区别和记忆)
冒泡:两两比较连续数据并执行必要的交换
选择:依次比较数据和后续数据,选择恰当的位置交换
插入:依次比较数据和已排序数据,选择恰当的位置插入,其余元素顺移