1. 程式人生 > 其它 >簡單實現 call、apply、 bind

簡單實現 call、apply、 bind

複雜度

時間複雜度(平均) 時間複雜度(最好) 時間複雜度(最壞) 空間複雜度 穩定性 複雜性
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時排序結束
  • 整體而言相當於對插入排序的一個優化,因為每次劃分陣列的排序都是基於上一次小劃分進行的.所以對當前劃分陣列的插入排序時間複雜度較低

程式碼

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;
}