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