希尔排序运行时间过长
ShellSort { (){} <Comparable<>> ([] data){ h= data./(h>=){ (start=start<hstart++){ (i=start+hi< data.i=i+h){ t=data[i]j(j=ij-h>=j=j-h){ (data[j].compareTo(data[j-h])<){ (datajj-h)} } } } h=h/} } <> (arr[]ab){ temp= arr[a]arr[a]=arr[b]arr[b]=temp} (String[] args) { startTime=System.()Integer arr[]=Test.()ShellSort.(arr)endTime=System.()time =(endTime-startTime)/System..println(+time+)} }
问题描述:
老师我的希尔排序运行10w需要20多秒。。。为啥啊,能帮我分析一下吗
17
收起
正在回答 回答被采纳积分+1
1回答
liuyubobobo
2022-08-19 12:14:40
慕课网的问答区代码显示有问题,我看不到你的完整代码。请在评论里再把完整代码贴一下,谢谢。
========
对小数组的插入排序过程,内循环需要这个 else break:
for (j=i;j-h>=0;j=j-h){ if (data[j].compareTo(data[j-h])<0){ swap(data,j,j-h); } else break; // 需要这个 else break }
这个 else break 非常关键,是插入排序面对有序数组能成为 O(n) 算法的核心。而插入排序面对有序数组是 O(n) 的,则是希尔排序的核心。(逐渐让数组有序)。
请你根据这个例子,再仔细体会一下插入排序算法的运行流程,以及逻辑的书写。
(课程给出了两个写法,无论是 12-16 行,还是 18-19 行,都请再仔细理解一遍)。
继续加油!:)
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星