插入排序之希尔排序
1. 定义:把记录按下标的一定增量分组,对于每组使用直接插入排序算法的排序;随着增量的逐渐减少,每组包含的关键字越来越少,当增量减至1时,整个文件被分为一组,算法便终止。
2. 原理:
(1)计算步长:步长=数组长度/2;
(2)根据步长分组,每组内部实行直接插入排序;
(3)重复执行(1)、(2)步骤,直到步长为1,算法变成快速排序。
3. 排序图表表示:

4. 复杂度:
空间复杂度O(1)
时间复杂度O(n^1.3)~O(n^2)
5. 总结:
(1)希尔排序时插入排序算法的一种更高效的改进;
(2)希尔排序是一种不稳定的算法;
(3)希尔排序实质上是一种分组插入方法.
6. C#代码实现:
class Program
{
static void Main(string[] args)
{
// 待排序数组
int[] sortArray = { 2, 8, 3, 5, 7, 1, 4, 6, 9 };
Stopwatch sw = new Stopwatch();
// 开始计时
sw.Start();
// 希尔排序算法
ShellSrot(sortArray);
// 计时结束
sw.Stop();
Console.WriteLine("希尔排序方法耗时(毫秒)=" + sw.ElapsedMilliseconds);
}
/// <summary>
/// 希尔排序
/// </summary>
/// <param name="sortArray">待排序数组</param>
private static void ShellSrot(int[] sortArray)
{
// 首次步长d
int d = sortArray.Length / 2;
while (d > 0)
{
// 按组循环排序
for (int i = 0; i < d; i++)
{
// 每组内部使用直接插入算法
for (int j = i + d; j < sortArray.Length; j += d)
{
int temp = sortArray[j];
int k;
// 每组中元素相互比较,大的后移
for (k = j - d; k >= i && sortArray[k] > temp; k = k - d)
{
sortArray[k + d] = sortArray[k];
}
// 插入小值
sortArray[k + d] = temp;
//for (k = j - d; k >= i; k = k - d)
//{
// if (sortArray[k] > sortArray[k + d])
// {
// int t = sortArray[k + d];
// sortArray[k + d] = sortArray[k];
// sortArray[k] = t;
// }
//}
}
}
d = d / 2;
// 打印输出
ShowSortResult(sortArray);
}
}
/// <summary>
/// 排序结果展示
/// </summary>
/// <param name="bubbleArray">排序数组</param>
private static void ShowSortResult(int[] sortArray)
{
for (int k = 0; k < sortArray.Length; k++)
{
Console.Write(sortArray[k] + " ");
}
Console.WriteLine();
}
}
7. 运行结果:


浙公网安备 33010602011771号