常用排序之插入排序

算法简介:

  简单来看,插入排序就像我们打扑克牌,(别告诉我你没玩过斗地主)。我们每次摸牌,都会按从大到小或者从小到大的规则,将其插入到指定地方。每次摸牌之间,我们手上的牌都是有序的。

  插入排序算法复杂度为O(n^2),适用于数据量较小的情况下使用。

 

实现思路:

1、从第二个数开始,将其取出,从已排好序的序列中从后向前扫描

2、如果已排好序的元素大于取出的元素,则将已排好序的元素向后移动一位

3、重复步骤2,直到找到已排好序的元素小于或等于取出的元素的位置。

4、将取出的元素放置该位置。

5、重复步骤1-4,直到最后一个元素插入到指定位置。

 

JAVA算法实现:

1、普通版:

 1 public static void insertionSort(int[] arr){
 2         //从第二个数开始,直到取到最后一个数
 3         for(int i=1;i<arr.length;i++){
 4             int key = arr[i];
 5             int j = i-1;
 6             //从后往前逐个取值比较,如果比取出数要大,就将其后移一位。
 7             while((j>=0) && (arr[j]>key)){
 8                 arr[j+1] = arr[j];
 9                 j--;
10             }
11             arr[j+1] = key ;
12         }
13     }

 

2、二分插入排序:其与直接排序算法最大的区别在于查找插入位置时使用的是二分查找的方式,在速度上有一定提升

public static void BinInsertionSort(int[] arr){
        for(int i=0;i<arr.length;i++){
            int key = arr[i];
            int left = 0;
            int right = i-1;
            
            while(left<=right){
                int middle = (left+right)/2;
                
                if(arr[middle]>key){
                    right =middle-1;
                }else{
                    left = middle+1;
                }
            }
            
            for(int j=i-1;j>=left;j--){
                arr[j+1] = arr[j];
            }
            
            arr[left] = key;
        }
    }

 

posted @ 2017-07-14 15:55  Substitute  阅读(191)  评论(0)    收藏  举报