Shell Sort (排序详解之 希尔排序)

希尔排序

本篇文章将介绍希尔排序。

重点:

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

第一轮:

Shell Sort (排序详解之 希尔排序)_第1张图片


Shell Sort (排序详解之 希尔排序)_第2张图片Shell Sort (排序详解之 希尔排序)_第3张图片

Shell Sort (排序详解之 希尔排序)_第4张图片

Shell Sort (排序详解之 希尔排序)_第5张图片


第一轮结束,第二轮 index/=2 = 4/2 = 2

Shell Sort (排序详解之 希尔排序)_第6张图片

Shell Sort (排序详解之 希尔排序)_第7张图片Shell Sort (排序详解之 希尔排序)_第8张图片

Shell Sort (排序详解之 希尔排序)_第9张图片Shell Sort (排序详解之 希尔排序)_第10张图片


Shell Sort (排序详解之 希尔排序)_第11张图片Shell Sort (排序详解之 希尔排序)_第12张图片


第三轮: i/=2=2/2 = 1

Shell Sort (排序详解之 希尔排序)_第13张图片

Shell Sort (排序详解之 希尔排序)_第14张图片

Shell Sort (排序详解之 希尔排序)_第15张图片

Shell Sort (排序详解之 希尔排序)_第16张图片

Shell Sort (排序详解之 希尔排序)_第17张图片

Shell Sort (排序详解之 希尔排序)_第18张图片

Shell Sort (排序详解之 希尔排序)_第19张图片


第四轮: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;
       }


完。

希望现在您已经明白了希尔排序,感谢您的阅读!:)

你可能感兴趣的:(shell)