💬💬作者有话想说:
💟作者简介:我目前是一个在校学生,想通过自己的学习努力让自己的技术、知识都慢慢提升,希望我们一起学习呀~💜💜💜
☂️兴趣领域:目前偏向于前端学习 💜💜💜
🎬> 活动地址:CSDN21天学习挑战赛
💜有话想说:写博客、记笔记并不是一种自我感动,把学到的东西记在脑子里才是最重要的,在这个过程中,不要浮躁,希望我们都可以越来越优秀!💜💜💜
🪀语言说明:代码实现我会用Python/C++~
希尔排序(shell 排序),其实也是插入排序的一种,又称缩小增量排序。我们可以把全部元素分成几组,等距离的元素在一组,然后每组元素比较大小,进行换位置。然后继续缩小间距,直到间距为1时停止,此时已有序,是改进版的插入排序。
💡💡思路:
- 增量的变化会直接影响到希尔排序的性能,因此希尔排序的时间复杂度与增量序列高度相关
这个时间复杂度 还不太理解。。。。。
- 算法在执行过程中只需要定义的几个临时变量,所以空间复杂度为常数级:O(1)。
C++代码:
#include
using namespace std;
void shellSort(int arr[], int n)
{
int tmp = 0;
int gap = n / 2;
while (gap)
{
for (int i = gap; i < n; i++)
{
tmp = arr[i];
int j = i;
// 直接插入排序
while (j >= gap && tmp < arr[j - step])
{
arr[j] = arr[j - gap];
j -= gap;
}
arr[j] = tmp;
}
// 缩短增量
gap = gap / 2;
}
}
int main()
{
int arr[]{ 8, 13, 2, 44, 3, 7, 15, 4, 9, 10};
int n = sizeof(arr) / sizeof(arr[0]);
shellSort(arr, n);
for (int i = 0; i < n; i++)
cout << arr[i] << " ";
return 0;
}
Python代码:
def shell_sort(arr):
n = len(arr)
# 初始步长
gap = n // 2
# gap变化到0之前,插入排序执行的次数
while gap > 0:
# 按步长进行插入排序
for j in range(gap, n):
i = j
# 插入排序
while i > 0:
if arr[i] < arr[i - gap]:
arr[i], arr[i - gap] = arr[i - gap], arr[i]
i -= gap
else:
break
# 缩短增量
gap = gap // 2
if __name__ == "__main__":
arr = [8, 13, 2, 44, 3, 7, 15, 4, 9, 10]
shell_sort(arr)
print(arr)
优点:
不需要大量的辅助空间,中等大小规模表现良好
缺点:
很不稳定!
希尔排序利用了插入排序对“部分有序”或“小规模”数组高效排序的优势:分组是为了让插入排序每次处理小规模数组;经过多次分组排序后整个数组变得“部分有序”,最后再用一次插入排序。