基础知识(04) -- 插入排序

插入排序是基于比较的排序,所谓的基于比较,就是通过比较数组中的元素,看谁大谁小,根据结果来调整元素的位置。
因此,对于这类排序,就有两种基本的操作: 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 }

 

posted @ 2017-01-01 10:35  火爆泡菜  阅读(209)  评论(0编辑  收藏  举报