插入排序是基于比较的排序,所谓的基于比较,就是通过比较数组中的元素,看谁大谁小,根据结果来调整元素的位置。
因此,对于这类排序,就有两种基本的操作: 1.比较操作 2.交换操作 ;其中对于交换操作,可以优化成移动操作,即不直接进行两个元素的交换,而是用一个中间值(temp)将当前元素保存起来,然后执行移动操作,待确定了最终位置后,再将当前元素放入合适的位置。
基本思路:
插入排序算法有种递归的思想在里面,它由N-1趟排序组成。
初始时,只考虑数组下标0处的元素,只有一个元素,显然是有序的。
然后第一趟,对下标1处的元素进行排序,保证数组[0][1]位置上的元素有序。
然后第二趟,对下标2处的元素进行排序,保证数组[0][1][2]位置上的元素有序。
....
....
第N-1趟,对下标N-1处的元素进行排序,保证数组[0,N-1]上的元素有序,也就是整个数组有序了。
它的递归思想就体现在: 当对位置i处的元素进行排序时,[0,i-1]上的元素一定是已经有序的了。
效率: 比较和交换次数都为O(N的平方),大致为N*(N-1)/4,所以这个算法比冒泡大致快了一倍,比选择排序略快,尤其是部分数据已经局部有序的情况下,这个算法效率会更高。
1 /** 2 * 演示插入法排序 3 * @author Administrator 4 * 5 */ 6 public class InsertSort { 7 public void insertSort(int[] arrays){ 8 int j = 0; 9 10 for(int i = 1;i < arrays.length;i++){ 11 int temp = arrays[i]; 12 13 for(j = i; j > 0;j--){ 14 if(arrays[j-1] >= temp){ 15 arrays[j] = arrays[j-1]; 16 }else{ 17 break; 18 } 19 } 20 arrays[j] = temp; 21 } 22 } 23 24 public static void main(String[] args) { 25 InsertSort is = new InsertSort(); 26 int[] arrays = {5,2,8,1,4,9,7}; 27 is.insertSort(arrays); 28 29 for(int num : arrays){ 30 System.out.print(num + " "); 31 } 32 } 33 }