希尔排序是一种改进的插入排序算法,它通过将原始数据分成多个子序列来改善插入排序的性能,每个子序列的元素间隔为 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) |
稳定性 | 不稳定 |
适用性 | 只可用于顺序表,不可用于链表 |