本篇文章将介绍希尔排序。
重点:
1.计算 "希尔索引" ->index ,一般初始值定为arr.length / 2,做为最外层循环 index > 0
2.设第二层循环i = index , I∈[index,arr.Count) i++,设最内层循环 j = i , j∈[index,i ] ,对比arr[j]与arr[j-index] ,如果小于(或大于)交换,如果 j-index>=0 , j-=index,循环执行
3.每次重设”希尔索引”: index/=2
这么一看有点小复杂,现在我们一步一步说明希尔排序的过程:
同样,我们以一个数组为例:
5, 1, 9 , 3, 7 , 4 , 8 ,6 , 2
第一轮:
第一轮结束,第二轮 index/=2 = 4/2 = 2
第三轮: i/=2=2/2 = 1
第四轮:index/2 = 0 < 1 ,跳出循环,排序结束。
参考代码:
public List<int>ShellSort(List<int> arr) { var sortedArr = new List<int>(); arr.ForEach(sortedArr.Add); if (sortedArr.Count < 2) return sortedArr; var index = sortedArr.Count / 2; while (index >= 1) { for (var i = index; i <sortedArr.Count; i++) { for (var j = i; j >=index; j -= index) { if (sortedArr[j] <sortedArr[j - index]) { var tmp =sortedArr[j]; sortedArr[j] = sortedArr[j - index]; sortedArr[j -index] = tmp; } } } index /= 2; } return sortedArr; }
完。
希望现在您已经明白了希尔排序,感谢您的阅读!:)