第一部分 排序详解
注:所以中转变量不能使用数组下标,而是设置一个值作为中转的值,否则在中转的过程中会改变数组中的值
一、插入排序
直接插入排序(从后向前找到合适位置后插入)
找到合适位置插入,表示在运行到当前数时,从前面到当前数的顺序是排完的,但是后方未插入的数的顺序是没有排完的。
其实上方数组中的的插入排序可以这样理解,一开始数组里只有57,68来了之后需要跟之前的一个数也就是57比较,此时数组里有两个数且排序结果为57,68 之后又来了一个数59,它先和之前第一个68比较,发现它比68小,就把59插到68的前面,再把59和再之前的57进行比较,此时排序的结果是57,59,68(此时用的是内循环),这时候再来一个数52,它先和68比较,比68小交换位置,然后和59进行比较,比59小交换位置,最后和57比较,比57小交换位置。
代码实现:i其实表示的是当前数是第几个数也就是在第几个数之后插入数
其实插入排序可优化,因为当58 59 60 当61进来后发现它比60小,就可以结束此次排序了,而事实上没有,又比了一下前面的数。
二、选择排序
在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。
直接找到最小的数,倒数第二个小的数,如此循环。
代码实现:
i表示还是当前数是第几个,然后j表示的是与i比较的是是第几个数i范围到arr.lengh_1
三、冒泡排序:
基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。而第一次排序最后一个数就可以确定是最大的数,但是第一个数不能确定是最小的
此时外循环还是表示第几次,比较的数有多少个就比较多少次,而内循环表示比较数的下标,实现“冒泡”
第一趟排序:
第一次排序:6和3比较,6大于3,交换位置:3 6 8 2 9 1
第二次排序:6和8比较,6小于8,不交换位置:3 6 8 2 9 1
第三次排序:8和2比较,8大于2,交换位置:3 6 2 8 9 1
第四次排序:8和9比较,8小于9,不交换位置:3 6 2 8 9 1
第五次排序:9和1比较:9大于1,交换位置:3 6 2 8 1 9
第一趟总共进行了5次比较, 排序结果:3 6 2 8 1 9
---------------------------------------------------------------------
第二趟排序:
第一次排序:3和6比较,3小于6,不交换位置:3 6 2 8 1 9
第二次排序:6和2比较,6大于2,交换位置:3 2 6 8 1 9
第三次排序:6和8比较,6大于8,不交换位置:3 2 6 8 1 9
第四次排序:8和1比较,8大于1,交换位置:3 2 6 1 8 9
第二趟总共进行了4次比较, 排序结果:3 2 6 1 8 9
---------------------------------------------------------------------
第三趟排序:
第一次排序:3和2比较,3大于2,交换位置:2 3 6 1 8 9
第二次排序:3和6比较,3小于6,不交换位置:2 3 6 1 8 9
第三次排序:6和1比较,6大于1,交换位置:2 3 1 6 8 9
第二趟总共进行了3次比较,排序结果: 2 3 1 6 8 9
---------------------------------------------------------------------
第四趟排序:
第一次排序:2和3比较,2小于3,不交换位置:2 3 1 6 8 9
第二次排序:3和1比较,3大于1,交换位置:2 1 3 6 8 9
第二趟总共进行了2次比较,排序结果: 2 1 3 6 8 9
---------------------------------------------------------------------
第五趟排序:
第一次排序:2和1比较,2大于1,交换位置:1 2 3 6 8 9
第二趟总共进行了1次比较,排序结果: 1 2 3 6 8 9
---------------------------------------------------------------------
最终结果:1 2 3 6 8 9
代码实现:把图里的j<5-i改成j<5-i-1不然下标越界:因为j+1<5-i所以j<5-i-1
为什么j<5-i-1 和j<5-1都可以?
第一次比较,最后一个数确定是最大的,第二次比较的时候其实不用比最后一个数,,-i就是为了实现这个的,不减就是把后边又比了一次效率低
注:只有选择排序的i表示的是第几个数,用入下方循环
有何异同:
1.插入排序:也就是说在插入的数中第一个数是最小的,但是并不一定是最小的
2.选择排序:也就是已经排好的第一个数一定是最小的
3.冒泡排序:只是把当前的数与之后数比较后先放到比较合适的位置
插入和冒泡其实差不多,一个往前比,一个往后比
为什么选择排序效率低?因为它进行无用的交换太多