数据结构经典算法之一 直接插入排序的两种实现方法

直接插入排序

基本思想 : 减治算法。把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列

当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置并将array[i]插入,原来位置上的元素顺序后移

  1. 在有序部分,查找合适的位置
    1.1 遍历查找:j为有序部分,i为无序部分的第一个数,则j+1的位置就是要插入的位置
    1.2 二分查找
  2. 把选择的数插入到合适的下标处
    顺序表,给定pos做插入
    数据结构经典算法之一 直接插入排序的两种实现方法_第1张图片
/**
 * 直接插入排序
 */
public class InsertSort {

    //1.遍历查找,顺序表,给定pos做插入
    private static void insertSort1(int[] array){
        //有序[0,i)
        //无序[i,array.length)
        for(int i = 0; i < array.length; i++){
            int j;
            //1.从后往前遍历
            for(j = i - 1; j >= 0 && array[i] < array[j]; j--){
            }

            //给定pos的位置,j+1即要插入的位置
            int pos = j + 1;
            int key = array[i];
            //从后往前移动数据
            for(int k = i; k > pos; k--){
                array[k] = array[k - 1];
            }
            array[pos] = key;
        }
    }

    //遍历排序,不给定pos
    private static void insertSort2(int[] array){
        for(int i = 0; i <array.length; i++){
            int key = array[i];
            int j = i - 1;
            for(; j >= 0 && key < array[j]; j--){
                array[j + 1] = array[j];  //j前移
            }
            array[j + 1] = key;
        }
    }

    //2.二分查找,给定pos
    private static void insertSort3(int[] array){
        for(int i = 0; i < array.length; i++){
            int left = 0;
            int right = i;
            int key = array[i];
            int mid = left + ( right + left ) / 2;
            //1.找合适的位置
            while(left < right){
                //判断key与mid的值大小
                if(key == array[mid]){
                    left = mid + 1; //调整left的值,left之前的数都已有序
                } else if(key < array[mid]){
                    //有序[left,mid)
                    //无序[mid,right)
                    right = mid;    //key值小,调整mid和right位置
                } else {
                    left = mid + 1;
                }
            }
            //2.把当前值插入到合适的位置
            int pos = left;
            for(int k = i; k > pos; k--){
                array[k] = array[k - 1];	//数据统一后移
            }
            array[pos] = key;
        }
    }
}

直接插入排序特性总结:

  1. 元素集合越接近有序,直接插入排序算法的时间效率越高
  2. 时间复杂度:最好O(n),平均O(n^2),最坏O(n ^2)
  3. 空间复杂度:O(1)
  4. 稳定性:稳定
  5. 减治算法

你可能感兴趣的:(JavaDS)