java自学程序员

第一部分 排序详解

2017-10-26  本文已影响7人  孙浩j

注:所以中转变量不能使用数组下标,而是设置一个值作为中转的值,否则在中转的过程中会改变数组中的值


一、插入排序

直接插入排序(从后向前找到合适位置后插入)

找到合适位置插入,表示在运行到当前数时,从前面到当前数的顺序是排完的,但是后方未插入的数的顺序是没有排完的。

        其实上方数组中的的插入排序可以这样理解,一开始数组里只有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.冒泡排序:只是把当前的数与之后数比较后先放到比较合适的位置

插入和冒泡其实差不多,一个往前比,一个往后比

为什么选择排序效率低?因为它进行无用的交换太多

上一篇下一篇

猜你喜欢

热点阅读