C#算法基础之希尔排序

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Threading.Tasks;
  6 
  7 namespace ConsolePractice
  8 {
  9     class CArray
 10     {
 11         private int[] arr;
 12         //数组大小
 13         private int upper;
 14         //下标
 15         private int numElements;
 16 
 17         /// <summary>
 18         /// 初始化数组参数
 19         /// </summary>
 20         /// <param name="size"></param>
 21         public CArray(int size)
 22         {
 23             arr = new int[size];
 24             upper = size - 1;
 25             numElements = 0;
 26         }
 27 
 28         /// <summary>
 29         /// 插入方法
 30         /// </summary>
 31         /// <param name="item">存储的数</param>
 32         public void Insert(int item)
 33         {
 34             arr[numElements] = item;
 35             numElements++;
 36         }
 37 
 38         /// <summary>
 39         /// 输出方法
 40         /// </summary>
 41         public void DisplayElements()
 42         {
 43             for (int i = 0; i <= upper; i++)
 44             {
 45                 Console.Write(arr[i] + " ");
 46             }
 47             Console.WriteLine();
 48         }
 49 
 50         /// <summary>
 51         /// 清除数组
 52         /// </summary>
 53         public void Clear()
 54         {
 55             for (int i = 0; i <= upper; i++)
 56             {
 57                 arr[i] = 0;
 58             }
 59             numElements = 0;
 60         }
 61 
 62         /*
 63          * 希尔排序其实就是插入排序的改进,可以按任意数量自增
 64          */
 65         /// <summary>
 66         /// 希尔排序算法
 67         /// </summary>
 68         public void ShellSort()
 69         {
 70             int inner, temp;
 71             //每次按3自增
 72             int h = 3;
 73             while (h > 0)
 74             {
 75                 for (int outer = h; outer <= upper; outer++)
 76                 {
 77                     temp = arr[outer];
 78                     inner = outer;
 79                     //把一个元素取出来逐个跟之前h距离的元素比较。
 80                     //若该元素较小则较大的元素往右移。
 81                     //若该元素较大则结束循环。
 82                     while (inner > h-1 && arr[inner - h] >= temp)
 83                     {
 84                         arr[inner] = arr[inner - h];
 85                         inner -= h;
 86                     }
 87                     arr[inner] = temp;
 88                     this.DisplayElements();
 89                 }
 90                 //h--;
 91                 h = (h - 1) % h;
 92                 Console.WriteLine("h=" + h);
 93             }
 94         }
 95     }
 96 
 97     class C_shape
 98     {
 99         static void Main()
100         {
101             CArray nums = new CArray(10);
102             Random rnd = new Random(100);
103             for (int i = 0; i < 10; i++)
104             {
105                 nums.Insert(rnd.Next(0, 100));
106             }
107             Console.WriteLine("Before sorting:");
108             nums.DisplayElements();
109             Console.WriteLine("During sorting:");
110             nums.ShellSort();
111             Console.WriteLine("After sorting:");
112             nums.DisplayElements();
113             Console.ReadKey();
114         }
115     }
116 }

运行结果:

原文地址:https://www.cnblogs.com/zt102545/p/3454726.html