希尔排序
本篇文章将介绍希尔排序。
重点:
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;
}
完。
希望现在您已经明白了希尔排序,感谢您的阅读!:)