插入排序

思想:把当前序列分成两部分,左边为有序的(初始大小为1),右边为无序,依次把无序的数据插入到有序序列中

void intsertSort(int[] arr, int n){
    for(int i = 1; i < n-1; i++){
        int j = i -1;
        while(j >= 0 && arr[j] > arr[i]){
            arr[j+1] = arr[j];
            j--;   
        }
        arr[j+1] = arr[i];
   } 
}

时间复杂度O(n^2)

 

 

希尔排序:

    若待排序序列基本有序,则插入排序效率更高

    使用分治法,分解成多个小问题,初始规模小,待合成大问题时,已基本有序

package com.algorithm.sort;

public class ShellSort implements Sort {

    @Override
    public void sort(int[] arr) {
        // TODO Auto-generated method stub
        int len = arr.length;
        int j;
        for (int d = len/2; d >= 1;d = d/2){
            for (int i = d + 1; i < len; i++){
                int temp = arr[i];
                for (j = i -d; j >= 0 && arr[j] > temp; j = j -d)
                    arr[j + d] = arr[j];
                arr[j+d] = temp;
            }
        }
    }
    
    public static void main(String[] args){
        int[] arr = {1,3,2,6,9,4,5,7,8,56,7,8,9,3};
        Sort sort =new ShellSort();
        sort.sort(arr);
        
        for(int a: arr){
            System.out.print(a + " ");
        }
    }
}

时间复杂度 O(nlogn)