簡單實現 call、apply、 bind
阿新 • • 發佈:2021-08-10
複雜度
時間複雜度(平均) | 時間複雜度(最好) | 時間複雜度(最壞) | 空間複雜度 | 穩定性 | 複雜性 |
---|---|---|---|---|---|
O(n^1.3) | O(n^1.3) | O(n^1.3) | O(1) | 不穩定 | 較簡單 |
思路
- 選定增量gap,基於增量gap對待排序陣列進行劃分
- (gap既相當於劃分出的陣列個數,有相當於對每個劃分陣列相鄰運算的距離)
- (gap一般初始為陣列長度/2, 每次迴圈gap/=2)
- 將1劃分出的陣列進行排序(基於插入排序)
- 縮小gap(gap/=2),劃分陣列,對劃分出的陣列繼續進行排序
- 至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; }