达内潍坊中心 > 达内新闻
C# 希尔排序
- 发布:山东编程
- 来源:互联网
- 时间:2018-04-29 13:01
初始时,有一个大小为 10 的无序序列。
在第一趟排序中,我们不妨设 gap1 = N / 2 = 5,即相隔距离为 5 的元素组成一组,可以分为 5 组。
接下来,按照直接插入排序的方法对每个组进行排序。
在第二趟排序中,我们把上次的 gap 缩小一半,即 gap2 = gap1 / 2 = 2 (取整数)。这样每相隔距离为 2 的元素组成一组,可以分为 2 组。
按照直接插入排序的方法对每个组进行排序。
在第三趟排序中,再次把 gap 缩小一半,即gap3 = gap2 / 2 = 1. 这样相隔距离为 1 的元素组成一组,即只有一组。
按照直接插入排序的方法对每个组进行排序。此时,排序已经结束。
需要注意一下的是,图中有两个相等数值的元素 5 和 5 .我们可以清楚的看到,在排序过程中,两个元素位置交换了。
所以,希尔排序是不稳定的算法。
算法分析:
时间复杂度:平均情况:O(Nlog2N) 最坏情况:O(N1.5)
空间复杂度:O(1)
参考代码:
1 static void Main(string[] args)
2 {
3 int[] arr = new int[] { 9, 1, 2, 5, 7, 4, 8, 6, 3, 5 };
4 ShellSort(arr);
5 Console.ReadKey();
6 }
7 public static void ShellSort(int[] array)
8 {
9 int gap = array.Length / 2;
10
11 while (1 <= gap)
12 {
13 // 把距离为 gap 的元素编为一个组,扫描所有组
14 for (int i = gap; i < array.Length; i++)
15 {
16 int j = 0;
17 int temp = array[i];
18
19 // 对距离为 gap 的元素组进行排序
20 for (j = i - gap; j >= 0 && temp < array[j]; j = j - gap)
21 {
22 array[j + gap] = array[j];
23 }
24 array[j + gap] = temp;
25 }
26
27 Console.WriteLine(“gap={0}”, gap);
28 foreach (int n in array)
29 {
30 Console.Write(“{0} ”, n);
31 }
32 Console.WriteLine();
33
34 gap = gap / 2; // 减小增量
35 }
36 }
更多潍坊培训学校相关资讯,请扫描下方二维码
最新开班时间
- 北京
- 上海
- 广州
- 深圳
- 南京
- 成都
- 武汉
- 西安
- 青岛
- 天津
- 杭州
- 重庆
- 哈尔滨
- 济南
- 沈阳
- 合肥
- 郑州
- 长春
- 苏州
- 长沙
- 昆明
- 太原
- 无锡
- 石家庄
- 南宁
- 佛山
- 珠海
- 宁波
- 保定
- 呼和浩特
- 洛阳
- 烟台
- 运城
- 潍坊
C# 希尔排序
- 发布:山东编程
- 来源:互联网
- 时间:2018-04-29 13:01
初始时,有一个大小为 10 的无序序列。
在第一趟排序中,我们不妨设 gap1 = N / 2 = 5,即相隔距离为 5 的元素组成一组,可以分为 5 组。
接下来,按照直接插入排序的方法对每个组进行排序。
在第二趟排序中,我们把上次的 gap 缩小一半,即 gap2 = gap1 / 2 = 2 (取整数)。这样每相隔距离为 2 的元素组成一组,可以分为 2 组。
按照直接插入排序的方法对每个组进行排序。
在第三趟排序中,再次把 gap 缩小一半,即gap3 = gap2 / 2 = 1. 这样相隔距离为 1 的元素组成一组,即只有一组。
按照直接插入排序的方法对每个组进行排序。此时,排序已经结束。
需要注意一下的是,图中有两个相等数值的元素 5 和 5 .我们可以清楚的看到,在排序过程中,两个元素位置交换了。
所以,希尔排序是不稳定的算法。
算法分析:
时间复杂度:平均情况:O(Nlog2N) 最坏情况:O(N1.5)
空间复杂度:O(1)
参考代码:
1 static void Main(string[] args)
2 {
3 int[] arr = new int[] { 9, 1, 2, 5, 7, 4, 8, 6, 3, 5 };
4 ShellSort(arr);
5 Console.ReadKey();
6 }
7 public static void ShellSort(int[] array)
8 {
9 int gap = array.Length / 2;
10
11 while (1 <= gap)
12 {
13 // 把距离为 gap 的元素编为一个组,扫描所有组
14 for (int i = gap; i < array.Length; i++)
15 {
16 int j = 0;
17 int temp = array[i];
18
19 // 对距离为 gap 的元素组进行排序
20 for (j = i - gap; j >= 0 && temp < array[j]; j = j - gap)
21 {
22 array[j + gap] = array[j];
23 }
24 array[j + gap] = temp;
25 }
26
27 Console.WriteLine(“gap={0}”, gap);
28 foreach (int n in array)
29 {
30 Console.Write(“{0} ”, n);
31 }
32 Console.WriteLine();
33
34 gap = gap / 2; // 减小增量
35 }
36 }
更多潍坊培训学校相关资讯,请扫描下方二维码
最新开班时间
- 北京
- 上海
- 广州
- 深圳
- 南京
- 成都
- 武汉
- 西安
- 青岛
- 天津
- 杭州
- 重庆
- 厦门
- 哈尔滨
- 济南
- 福州
- 沈阳
- 合肥
- 郑州
- 长春
- 苏州
- 大连
- 长沙
- 昆明
- 温州
- 太原
- 南昌
- 无锡
- 石家庄
- 南宁
- 中山
- 兰州
- 佛山
- 珠海
- 宁波
- 贵阳
- 保定
- 呼和浩特
- 东莞
- 洛阳
- 潍坊
- 烟台
- 运城