希尔排序(Shell Sort)是插入排序的一种。是针对直接插入排序算法的改进。该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。
增量序列的取值依次为: 5,3,1
① 最后一个增量必须为1;
解读:
希尔排序算法引入了一个增量,该增量把原来的序列分割成多个序列,先在各个序列内进行插入排序,使整个序列变的“基本有序”。增量可以是多个,最后一个必须是1.本文的例子增量是5,3,1
当增量是5的时候,{【1】,【6】},{【2】,【7】}……是一组,总共5组。
他们先进行第一个希尔排序
然后增量为3的时候,{【1】,【4】,【7】,【9】},{【2】,【5】,【8】},{【3】,【6】,【9】}是一组。
继续进行希尔排序。
最后增量是1.整个序列是一组。
c#代码
/// <summary>
/// 希尔(插入)排序
/// </summary>
/// <param name="array"></param>
/// <param name="increments">增量集合</param>
static void ShellOrder(ref int[] array,int[] increments)
{
for(int n = 0;n < increments.Length;n++)
{
ShellInsert(ref array, increments[n]);
}
}
static void ShellInsert(ref int[] array, int dk)
{
for (int i = 1 + dk; i < array.Length; ++i)
{
if (array[i] < array[i - dk])//如果小于,【i】赋值到哨兵中。
{
array[0] = array[i];
int j = 0;
for (j = i - dk; j > 0 && array[0] < array[j] ; j -= dk)//记录后移,插入排序的基本原理,空出正确的位置
{
array[j + dk] = array[j];
}
array[j + dk] = array[0];
}
}
}
//调用
int[] array = {0,49,38,65,97,76,13,27,49 };
int[] increments ={ 5,3,1};
ShellOrder(ref array, increments);
for (int n = 0; n < array.Length; n++)
{
Console.Write(array[n].ToString() + ",");
}
基本思想
希尔排序基本思想: 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。 该方法实质上是一种分组插入方法。 给定实例的shell排序的排序过程 假设待排序文件有10个记录,其关键字分别是: 49,38,65,97,76,13,27,49,55,04。增量序列的取值依次为: 5,3,1
① 最后一个增量必须为1;
解读:
希尔排序算法引入了一个增量,该增量把原来的序列分割成多个序列,先在各个序列内进行插入排序,使整个序列变的“基本有序”。增量可以是多个,最后一个必须是1.本文的例子增量是5,3,1
当增量是5的时候,{【1】,【6】},{【2】,【7】}……是一组,总共5组。
他们先进行第一个希尔排序
然后增量为3的时候,{【1】,【4】,【7】,【9】},{【2】,【5】,【8】},{【3】,【6】,【9】}是一组。
继续进行希尔排序。
最后增量是1.整个序列是一组。
c#代码
/// <summary>
/// 希尔(插入)排序
/// </summary>
/// <param name="array"></param>
/// <param name="increments">增量集合</param>
static void ShellOrder(ref int[] array,int[] increments)
{
for(int n = 0;n < increments.Length;n++)
{
ShellInsert(ref array, increments[n]);
}
}
static void ShellInsert(ref int[] array, int dk)
{
for (int i = 1 + dk; i < array.Length; ++i)
{
if (array[i] < array[i - dk])//如果小于,【i】赋值到哨兵中。
{
array[0] = array[i];
int j = 0;
for (j = i - dk; j > 0 && array[0] < array[j] ; j -= dk)//记录后移,插入排序的基本原理,空出正确的位置
{
array[j + dk] = array[j];
}
array[j + dk] = array[0];
}
}
}
//调用
int[] array = {0,49,38,65,97,76,13,27,49 };
int[] increments ={ 5,3,1};
ShellOrder(ref array, increments);
for (int n = 0; n < array.Length; n++)
{
Console.Write(array[n].ToString() + ",");
}
本文使用Blog_Backup未注册版本导出,请到soft.pt42.com注册。