希尔排序Shell Sort是基于插入排序的一种改进,同样分成两部分
希尔排序介绍
也称缩小增量排序准备待排数组
[ 6 2 4 1 5 9]
首先需要选取关键字,例如关键是3和1(第一步分成三组,第二 步分成一组),那么待排
数组分成了以下三个虚拟组:
[6 1]一组
[2 5]二组
[4 9]三组
看仔细啊,不是临近的两个数字分组,而是3(分成了三组)的倍数的数字为下标的分成了一组,
就是每隔3个数取一一个,每隔三个再取一一个,这样取出来的数字放到一组,把它们当成一组,但不实际分组,只是当成一-组来看,所以 上边的"组"实际上并不存在,只是为了说明分组关系对以上三组分别进行插入排序变成下边这样
[1 6] [2 5] [4 9]
具体过程:
[6 1]6和1交换变成[1 6]
[2 5]2与5不动还是[2 5]
[4 9]4与9不动还是[4 9]
第一趟排序状态演示:
待排数组:[624 15 9]
排后数组:[1 2465 9]
第二趟关键字取的是1,即每隔一个取一一个组成新数组,实际上就是只有一组啦,隔一取一就全部取出来了此时待排数组为:
[1 2 4 6 5 9]
//C#语言
class MainClass{
public static void Main(string[] args)
{
int[] arrr = { 6, 2, 4, 1, 5, 9};
XierPaixu(arrr);
Console.WriteLine(arrr.GetHashCode());
}
static void ShellSort(int[] a)
{
for (int i = a.Length / 2; i > 0; i /= 2)
{
for (int j = 0; j + i < a.Length; j++)
{
for (int k = j; k + i < a.Length; k += i)
{
BiDaXiao(ref a[k], ref a[k + i]);
}
}
}
}
public static void BiDaXiao(ref int a, ref int b)
{
if (a > b)
{
int c = a;
a = b;
b = c;
}
}
}