希尔排序运行时间过长
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 星