首先,这是我的 Shell 排序代码(使用 Java):
public char[] shellSort(char[] chars) {
int n = chars.length;
int increment = n / 2;
while(increment > 0) {
int last = increment;
while(last < n) {
int current = last - increment;
while(current >= 0) {
if(chars[current] > chars[current + increment]) {
//swap
char tmp = chars[current];
chars[current] = chars[current + increment];
chars[current + increment] = tmp;
current -= increment;
}
else { break; }
}
last++;
}
increment /= 2;
}
return chars;
}
这是 Shell 排序的正确实现吗(暂时忘记最有效的间隙序列 - 例如,1,3,7,21...)?我问是因为我听说 Shell 排序的最佳情况时间复杂度是 O(n)。(参见http://en.wikipedia.org/wiki/Sorting_algorithm)。我看不到我的代码实现了这种效率水平。如果我向其中添加启发式方法,那么是的,但就目前而言,没有。
话虽如此,我现在的主要问题是 - 我很难为我的 Shell 排序实现计算 Big O 时间复杂度。我确定最外层循环为 O(log n),中间循环为 O(n),最内层循环也为 O(n),但我意识到内部两个循环实际上不是 O( n) - 他们会比这少得多 - 他们应该是什么?因为显然这个算法比 O((log n) n^2) 运行效率更高。
非常感谢任何指导,因为我很迷茫!:P