一、希尔排序
技术要点:现将整个待排序记录序列分隔成若干个子序列分别进行插入排序,待整个序列中的记录“基本有序”的时候再对全体记录进行一次直接插入排序。
例子:[7 9 10 5 11 6 ]进行希尔排序
步骤:
1.首先进行关键字的选取(排序的关键)如选取3和1(第一步分成3组,第二部分成1组)下面先分成3组
2.[7,5] [9,11] [10,6] 三个组(不是临近的数字组成一组,而是3的倍数+1组成一组),这3个组是为达到分析的目的进行的虚拟分组
3.对上面3组分别进行插入排序得到[5,7] [9,11] [6,10] 三个数组
4.因此第一趟排序后的结果为:[7 9 10 5 11 6 ]—》[5 9 7 6 11 10 ]
5.进行第二趟,关键字选取1组,参考步骤1 此时待排数组为[5 9 7 6 11 10 ]
6.对待排数组进行插入排序
7.对于关键字的判断选择一般情况下如果是10个的话 选择 10 3 1 其他情况需要判断
希尔算法可以看作是改进的直接插入算法,其算法的性能与所选取的分组长度序列有很大关系
其时间性能的优势:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ShellSort //希尔排序算法
{
class Program
{
static void Main(string[] args)
{
int[] arr = { 7, 9, 10, 5, 11, 6 };
Console.WriteLine("未排序的数组");
foreach (var item in arr)
{
Console.Write(item + " ");
}
Console.WriteLine();
Console.WriteLine("希尔排序后的数组");
shell_sort(arr, 6);
foreach (var item in arr)
{
Console.Write(item + " ");
}
Console.ReadKey();
}
/// <summary>
///
/// </summary>
/// <param name="unsorted">待排数组</param>
/// <param name="length">数组长度</param>
static void shell_sort(int[] unsorted, int length)
{
int inc, i, j, temp;//inc为关键步长
//假定待排数组有6个,这里关键步长取3和1
for (inc = length / 2; inc > 0; inc = inc / 2) //第一躺:inc=3
{
for (i = inc; i < length; i++) //第一躺:inc=3情况下 i=3;
{
for (j = i - inc; j >= 0; j = j - inc) //第一躺:inc=3情况下 i=3情况下 j=0;
{
{
if (unsorted[j] > unsorted[j + inc]) //第一躺:inc=3情况下 i=3情况下 j=0 情况下 插入排序;
{
temp = unsorted[j];
unsorted[j] = unsorted[j + inc];
unsorted[j + inc] = temp;
}
}
}
}
}
}
}
}
结果演示:
未排序的数组:
7 9 10 5 11 6
希尔排序后的数组:
5 6 7 9 10 11