前言:
最近在学习排序,学习到希尔排序的时候对代码有一些感触,首先讲一下希尔排序是怎么个排序过程,然后在把我能够实现的从网上荡来的代码贴一下,然而这不是完了,我和组长大人在讨论一番后,发现这个荡来的代码是有些小问题的,所以把问题也写一下。
排序过程:
待排序数组:48, 37 ,64, 96, 75, 12, 26, 48, 54, 03
步骤一:选一个小于n(就是你的数组长度)的数字(比如选5),然后按照这个数来分组,即第一个和隔5个数之后的数字分为一组。在这个例子里:48和隔个5个数的12为一组,因为12后面不够5个数了,所以这个分组就到这了。
分组情况:
步骤二:将第一开始的分组的数字以直接插入的方式,按照从小到大的排序(也可以按照从大到小来)
12,26,45,54,03,48,37,64,98,75
步骤三:由于第二部进行了排序,在这个基础上,再一次选一个小于 d1的数字,d2,以这个数字分组,这次以d2=3举例
因此,第二次的分组情况如下:
步骤四:将刚刚分完组的数字,进行组内排序,还是以直接插入排序,所以排序之后结果是下面的情况:
12,03,45,37,26,48,54,64,75
步骤五:这次还要选一个数字d3作为分组的标准,第一,二两次分别用的5,3,这次用d3=1。也就是说这次可以直接整体用直接插入排序了。
步骤六:直接插入排序结果为:03,12,26,37,45,48,54,64,75
感想:这个排序很好理解的,我一步一步的说的也很明白(自认为),下面贴出来代码,凑合着实现一下吧。
namespace 希尔排序
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
int i;
int temp = 0;
int[] Array = { 48, 37, 64, 96, 75, 12, 26, 33, 54, 03 };
for (int gap = Array.Length / 3; gap > 0; gap--)//第一重循环,按照gap的大小进行分组
{
for (i = 0; i < gap; i++)//第二重循环,对所有分组进行排序
{
for (int j = i; j < Array.Length; j = j + gap)//第三重循环,组内进行直接插入排序
{
temp = Array[j];
int index = j - gap;
while (index >= 0 && Array[index] > temp)
{
Array[index + gap] = Array[index];
index = index - gap;
}
Array[index + gap] = temp;
}
}
label2.Text = label2.Text + "\r\n" + "第" + i + "次结果";
for (int k = 0;k <Array .Length ;k ++)
{
label2.Text = label2.Text + " " + Array[k];
}
}
}
}
}