第三周LJY关于插入排序
在通过视频学会了冒泡排序和选择排序后,去网上找了一下有没有其他的排序方法,了解并学会了插入排序.在这里写一点自己见解.在我看来插入排序就好比站队时候按大小个站,
一个班所有男生没站队的时候就是大小个混着的,无序的,老师一喊从低到高站,先出来了一个学生站在队伍里,这时候队伍里就他自己他是不需要比个子的,他是一号,然后第二个人,
就是第二个数进来比个子,比他矮站他前面比他高站他后面,第三个人进来,先跟最矮的比,比他高再跟第二个比,一直遇到比他高的,站在比他高的前面,就好比一排数据,大家排序,就跟这个是一
样的,进来找自己的位置,每个数据进来比的时候都是跟已经排好序的数据来比的,他可以从大的开始比,一直比到比他小的,他排到比他小的数字后面,也可以从小的开始比一直比到有比他大的,
他排到比他大的数字前面,这样这个后来排队的数组一直都是有序的状态,每个数字在进行插入的时候都是插入一个有序的数组,我认为这种效率在一些情况上是比冒泡排序高的,在了解了插入排序的原理后,
我决定先自己尝试用代码实现一下:
package com.zkc.d1; public class Example { public static void main(String[] args) { int[] arr ={1,5,7,33,22,14,55,64,88,43}; //先定义一个数组 for (int i = 0; i < arr.length; i++) { //获取到数组每个数据的索引 for (int j = i; j > 0; j--) { //插入排尾,从最大的开始比,最多一直比到最小的,此时他索引为1,为第二小的; if(arr[j] < arr[j-1]) { //如果比他前面的小.就换位置,插到他前面继续比 exchange(arr,j,j-1); } else break; } } for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } //换位置的方法 public static void exchange(int[] arr,int i ,int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } }
经过实现后,开始思索其与冒泡排序和选择排序的区别,下面是我练习时候敲的冒泡排序的代码;
public class sort { public static void main(String[] args) { /*数组元素:{24, 69, 80, 57, 13} 请对数组元素进行排序。 冒泡排序 相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处*/ int[] arr = {24,69,80,57,13}; int max = 0; for (int i = 0; i < arr.length - 1; i++) { for (int j = 0; j < arr.length -1 -i; j++) { if (arr[j] > arr[j + 1]) { exchange(arr, j, j+1); } } } for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } }
感觉插入排序效率会快一点,冒泡排序和选择排序更像是闯关打擂台,好比冒泡排序,五个人站在那,老五和老四打.比出个老四,然后老四和老三打,.比出个老三,....最后比出来了老大,
然后再重头打一遍比老二,比老二时候就没有利用上第一比武时候的数据,这种情况可以用一组数据可以很好体现他们差距,1,3,2,4这四个数根据插入排序,第一选出1,第二次用3和1去比
,排序为1,3这里比较次数为1次,然后用2去比较与三比一次与1比一次,比较次数变为了3,此时排序为1,2,3,然后4去比的时候只需要和3比一次就不用再比了因为前面的都比3小,
是有序的,而这个信息是之前比较的时候得到的,运用这个信息,4无需再和1,2比较,总比较次数为4次,而冒泡排序或者是选择排序次数为3+2+1 = 6次,他们的比较次数是固定的,越是有序的数据
他们的劣势就越大,如果一组数据是有序的为1,2,3,4,5.....,n;插入排序每次插入的数据只需要和排序好的数据中最大的比一次就可以,总共只需要比较n-1次;而选择和冒泡排序仍需要比较
(n-1)+(n -2) + ....+2 +1 = (n - 1)/2 * n;明显要复杂的多.
暂时就理解这么多,可能在某些地方上存在错误,敬请指点.