希尔排序的特点
希尔排序是对直接插入的一种优化
稳定性:不稳定
希尔排序的思想
将无序数组分割为若干个子序列,子序列不是逐段分割的,而是相隔特定的增量的子序列,对各个子序列进行插入排序;然后再选择一个更小的增量,再将数组分割为多个子序列进行排序,最后选择增量为1,即使用直接插入排序,使最终数组成为有序。
希尔排序的代码
public string Shell(int[] a)
{
string shu = "排好序的数组:";
int n = a.Length-1;
// gap为步长,每次减为原来的一半。
for (int gap = n / 2; gap > 0; gap /= 2)
{
for (int i = 1; i <=gap; i++) // 共gap个组,对每一组都执行直接插入排序
{
for (int j = i + gap; j <= n; j += gap) //外循环
{
int temp = a[j];
int position = j;
for (int k = j - gap; k >= 1; k -= gap) //内循环
{
if (temp < a[k])
{
a[k + gap] = a[k];
position = k;
}
else
{
break;
}
}
a[position] = temp;
}
}
}
for (int i = 1; i <a.Length ; i++)
{
shu = shu + " " + a[i].ToString();
}
return shu;
}
还可以这样写
public string Shell(int[] a)
{
string shu = "排好序的数组:";
int n = a.Length-1;
// gap为步长,每次减为原来的一半。
for (int gap = n / 2; gap > 0; gap /= 2)
{
for (int i = 1; i <=gap; i++) // 共gap个组,对每一组都执行直接插入排序
{
//平移法
// 如果a[j] < a[j-gap],则寻找a[j]位置,并将后面数据的位置都后移。
for (int j = i + gap; j <= n; j += gap) //外循环
{
if (a[j] < a[j - gap])
{
int tmp = a[j];
int k = j - gap;
while (k >= 1 && a[k] > tmp)
{
a[k + gap] = a[k];
k -= gap;
}
a[k + gap] = tmp;
}
}
}
}
for (int i = 1; i <a.Length ; i++)
{
shu = shu + " " + a[i].ToString();
}
return shu;
}