活动地址:21天学习挑战赛
目录
希尔排序法又称为缩小增量排序法,是一种基于插入思想的排序方法。它是直接插入排序法的进一步优化的算法,使得排序的性能有了一个极大的飞跃!
希尔排序法的伟大之处在于很好的利用了直接插入法的最佳性质:待排序记录较少且基本有序。所以希尔排序法的思路是将待排序的序列按照增量递减的方式分成若干个组,将原来较大的序列不断切割成一个个小的子序列,使子序列符合“数目少且基本有序”这一条件,然后分别对各个子序列进行直接插入排序,经过上述的操作后,使得整个序列已经基本有序,然后对整个序列进行一次直接插入排序,即可得到一个整体有序的序列,排序完成!
往期相关文章传送门:
(注:图片来自网络)
- package TwentyOne_Challenge;
-
- public class DaySeven {
- public static void main(String[] args) {
- int []a={3,38,5,44,15,36,26,27,2,47,46,4,19,50,48,100};
- System.out.print("原来序列如下:");
- for (int i = 0; i
- System.out.print(a[i]+" ");
- }
- sort(a);
- System.out.println();
- System.out.print("经过希尔排序后:");
- for (int i = 0; i
- System.out.print(a[i]+" ");
- }
- }
- private static void sort(int arr[]) {
- int n=arr.length,d = n;
- while (d>1) {
- //每次对增量d进行折半
- d/=2;
- //单趟排序
- for (int i = 0; i < n - d; i++) {
- int right = i;
- int temp = arr[right + d];//存储待排序元素
- while (right >= 0) {
- if (temp < arr[right]) {
- //组内排序
- arr[right + d] = arr[right];
- //组内的下一元素,从右往左
- right -= d;
- }
- else {
- break;
- }
- }
- //如果组内某一对元素已经有序则无需交换,将存储的待排序元素重新赋给原值
- arr[right + d] = temp;
- }
- }
- }
- }
2.执行结果

三、复杂度分析
1.时间复杂度
当增量大于1时,关键字较小的记录就不是一步一步地挪动,而是跳跃式地移动,从而使得,在进行最后一趟增量为1 的插人排序中,序列已基本有序,只要做记录的少量比较和移动即可完成排序,因此希尔排序的时间复杂度较直接插人排序低。
但要具体进行分析,则是一个复杂的问题,因为希尔排序的时间复杂度是所取“增量”序列的函数,这涉及一些数学上尚未解决的难题。因此,到目前为止尚未有人求得一种最好的增量序列,所以希尔排序的时间复杂度无法准确得出。
2.空间复杂度
希尔排序需要借助一个辅助空间,所以其空间复杂度为 O(1)
-
相关阅读:
Android---RecyclerView替代ListView
python中的logging模块——将日志保存到文件中
MySQL 开启配置binlog以及通过binlog恢复数据
2001-2022年上市公司供应链研究数据大全
springboot:自定义starter
Python爬虫程序网络请求及内容解析
全栈----跨域
Worthington肽合成应用丨胰凝乳蛋白酶方案
【Overload游戏引擎细节分析】鼠标键盘控制摄像机原理
在线编辑PDF:GcPDF|PDF在线预览GrapeCity Documen PDF
-
原文地址:https://blog.csdn.net/qq_52487066/article/details/126331729