uanghaou

导航

插入排序

直接插入排序

基本思想

插入排序是指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。按照此法对所有元素进行插入,直到整个序列排为有序的过程,称为插入排序。

排序过程

算法实现

/**
 * 直接插入排序
 * @param arr
 * @return
 */
public int[] insertionSort(int[] arr) {
        //0---i-1为有序序列,i---N为无序序列(N>=2)
    for (int i = 1; i < arr.length; i++) {
        //对 arr[i] 进行插入排序
        int key = arr[i];
        int j = i;
        //找到arr[i]的正确为,并将比arr[i]大的元素向后移到
        for (; j > 0 && arr[j - 1] > key;j--) {
            arr[j] = arr[j - 1];
        }
        //将arr[i] 放到对应位置
        arr[j] = key;
    }
    return arr;
}

@Test
public void TestInsertionSort() {
    int[] arr = new int[]{2,4,5,6,1,3};
    for (int i : insertionSort(arr)) {
        System.out.println(i);
    }
}

算法分析

时间效率 O(n^2)
空间效率 O(1)
稳定性 稳定

二分插入排序

由于直接插入排序的基本操作是在一个有序表中进行查找和插入的,二在有序表中的查找操作是可以利用二分查找来实现的,由此进行的插入排序称为二分插入排序。

算法实现

 /**
     * 二分插入排序
     * @return
     */
    public int[] BinaryInsertionSort(int[] arr){
        for(int i= 1,len = arr.length;i<len;i++){
            int key = arr[i];//先将待排序位置的值记录下来
            int start=0;
            int end=i-1;//有序序列的最后一个元素的下标
            while (start <= end){
                int mid = (end+start)/2;//取中点
                if(arr[mid] > key){
                    end = mid-1;//取左区间
                }else {
                    start = mid + 1;//取右区间
                }
            }
            //元素后移空出插入位置
            for(int k = i-1;k>=end+1;k--){
                arr[k+1] = arr[k];
            }
            //插入记录
            arr[end+1] = key;
        }
        return arr;
    }
    
    @Test
    public void TestInsertionSort() {
        int[] arr = new int[]{2, 4, 5, 6, 1, 3};
        for (int i : BinaryInsertionSort(arr)) {
            System.out.print(i+" ");
        }
    }
    //排序结果
    //1 2 3 4 5 6 

算法分析

时间效率 O(n^2)
空间效率 O(1)
稳定性 稳定

posted on 2020-09-01 22:39  uanghaou  阅读(225)  评论(0编辑  收藏  举报