码迷,mamicode.com
首页 > 编程语言 > 详细

排序算法-希尔排序

时间:2017-12-29 15:33:12      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:new   thread   数字   idt   style   log   ati   部分   表示   

部分内容转自-http://blog.csdn.net/morewindows/article/details/6668714

技术分享图片

希尔(Shell)排序又称为缩小增量排序,它是一种插入排序。它是直接插入排序算法的一种威力加强版

该方法因DL.Shell于1959年提出而得名。

希尔排序的基本思想是:

把记录按步长 gap 分组,对每组记录采用直接插入排序方法进行排序。
随着步长逐渐减小,所分成的组包含的记录越来越多,当步长的值减小到 1 时,整个数据合成为一组,构成一组有序记录,则完成排序。

 

以n=10的一个数组49, 38, 65, 97, 26, 13, 27, 49, 55, 4为例

第一次 gap = 10 / 2 = 5

49   38   65   97   26   13   27   49   55   4

1A                                        1B

        2A                                         2B

                 3A                                         3B

                         4A                                          4B

                                  5A                                         5B

1A,1B,2A,2B等为分组标记,数字相同的表示在同一组,大写字母表示是该组的第几个元素, 每次对同一组的数据进行直接插入排序。即分成了五组(49, 13) (38, 27) (65, 49)  (97, 55)  (26, 4)这样每组排序后就变成了(13, 49)  (27, 38)  (49, 65)  (55, 97)  (4, 26),下同。

第二次 gap = 5 / 2 = 2

排序后

13   27   49   55   4    49   38   65   97   26

1A             1B             1C              1D            1E

        2A               2B             2C             2D              2E

第三次 gap = 2 / 2 = 1

4   26   13   27   38    49   49   55   97   65

1A   1B     1C    1D    1E      1F     1G    1H     1I     1J

第四次 gap = 1 / 2 = 0 排序完成得到数组:

4   13   26   27   38    49   49   55   65   97

 

实现:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _009_希尔排序
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] data = new int[] { 42, 20, 75, 62, 24, 18, 8, 14, 35, 57, 18 };
            ShellSort(data);
            for (int i = 0; i < data.Length; i++)
            {
                Console.Write(data[i] + " ");
            }
        }
        public static void ShellSort(int[] dataArray)
        {
            int gap = dataArray.Length/2;
            while (gap>=1)
            {
                // 把距离为 gap 的元素编为一个组,扫描所有组
                for (int i = gap; i < dataArray.Length; i++)
                {
                    int iValue = dataArray[i];
                    int j = i - gap;
                    // 对距离为 gap 的元素组进行排序
                    while (j>=0 && dataArray[j]>iValue)
                    {
                        dataArray[j + gap] = dataArray[j];
                        j -= gap;
                    }
                    dataArray[j + gap] = iValue;
                }
                gap = gap / 2; // 减小增量
            }
        }
    }
}

 

 

 

排序算法-希尔排序

标签:new   thread   数字   idt   style   log   ati   部分   表示   

原文地址:https://www.cnblogs.com/rongweijun/p/8143378.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!