希爾排序是一種改進的插入排序算法,它通過將原始數據分成多個子序列來改善插入排序的性能,每個子序列的元素間隔為?d
(增量)。隨著算法的進行,d
?逐漸減小,最終減為 1,此時整個序列就被排序好了。
c++代碼:
// 希爾排序函數
void shell_sort(std::vector<int>& nums) {int temp = 0;int n = nums.size();// 初始增量為數組長度的一半,逐步縮小增量for (int d = n / 2; d >= 1; d /= 2) {// 對每個子序列進行插入排序,sub_start表示每個子序列的首元素索引for (int sub_start = 0; sub_start < d; sub_start++) {// 對當前子序列進行插入排序for (int i = sub_start + d; i < n; i += d) {if (nums[i] < nums[i - d]) {temp = nums[i];int j;// 移動元素,找到插入位置for (j = i - d; j >= 0 && nums[j] > temp; j -= d) {nums[j + d] = nums[j];}// 插入元素nums[j + d] = temp;}}}}
}
c語言代碼:
// 希爾排序函數
void shell_sort(int nums[],int n) {int temp = 0;// 初始增量為數組長度的一半,逐步縮小增量for (int d = n / 2; d >= 1; d /= 2) {// 對每個子序列進行插入排序,sub_start表示每個子序列的首元素索引for (int sub_start = 0; sub_start < d; sub_start++) {// 對當前子序列進行插入排序for (int i = sub_start + d; i < n; i += d) {if (nums[i] < nums[i - d]) {temp = nums[i];int j;// 移動元素,找到插入位置for (j = i - d; j >= 0 && nums[j] > temp; j -= d) {nums[j + d] = nums[j];}// 插入元素nums[j + d] = temp;}}}}
}
總結
時間復雜度 | 未知,但優于直接插入排序 |
空間復雜度 | O(1) |
穩定性 | 不穩定 |
適用性 | 只可用于順序表,不可用于鏈表 |