排序算法-希爾排序

複雜度

時間複雜度(平均) 時間複雜度(最好) 時間複雜度(最壞) 空間複雜度 穩定性 複雜性
O(n^1.3) O(n^1.3) O(n^1.3) O(1) 不穩定 較簡單

思路

  1. 選定增量gap,基於增量gap對待排序數組進行劃分
  • (gap既至關於劃分出的數組個數,有至關於對每一個劃分數組相鄰運算的距離)
  • (gap通常初始爲數組長度/2, 每次循環gap/=2)
  1. 將1劃分出的數組進行排序(基於插入排序)
  2. 縮小gap(gap/=2),劃分數組,對劃分出的數組繼續進行排序
  3. 至gap==0時排序結束
  • 總體而言至關於對插入排序的一個優化,由於每次劃分數組的排序都是基於上一次小劃分進行的.因此對當前劃分數組的插入排序時間複雜度較低

代碼shell

public void shellSort(int[] nums){
    int gap = nums.length / 2;
    while(gap != 0){
        for(int i = 0; i < gap; i++){ //此步循環至關於遍歷劃分出的數組
            for(int j = i + gap; j < nums.length; j += gap){//對某個具體數組進行操做
                int k = j;
                while(k - gap >= 0 && nums[k - gap] > nums[k]){
                    swap(nums, k, k - gap);
                    k -= gap;
                }
            }
        }
        gap /= 2;
    }
}

附插入排序(基於swap)代碼數組

public int[] insert(int[] nums){
    int[] temp = new int[nums.length];
    temp[0] = nums[0];
    for(int i = 1; i < nums.length; i++){
        for(int j = i - 1; j >= 0; j--){
            if(nums[i] < temp[j]){
                swap(temp, j, j + 1);
            }else {
                temp[j + 1] = nums[i];
                break;
            }
        }
    }
    return temp;
}

private void swap(int[] nums, int i, int j){
    int temp = nums[i];
    nums[i] = nums[j];
    nums[j] = temp;
}
相關文章
相關標籤/搜索