using System;
namespace 插入排序
{
class Program
{
static void Main(string[] args)
{
int[] arr = new int[] { 9, 1, 2, 5, 7, 4, 8, 6, 3, 5 };
ShellSort(arr);
Console.ReadKey();
}
public static void ShellSort(int[] array)
{
int gap = array.Length / 2;
while (1 <= gap)
{
for (int i = gap; i < array.Length; i++)
{
int j = 0;
int temp = array[i];
for (j = i - gap; j >= 0 && temp < array[j]; j = j - gap)
{
array[j + gap] = array[j];
}
array[j + gap] = temp;
}
Console.WriteLine("gap={0}", gap);
foreach (int n in array)
{
Console.Write("{0} ", n);
}
Console.WriteLine();
gap = gap / 2;
}
}
}
}
思路:把数组按gap步长分组,之后将每组数据从小到大排序,遍历一次之后将gap/2,继续排序,直到gap=1,排序结束.时间复杂度为:O(n^(1.3—2)),因此Shell排序较插入排序有着更好的性能.