博客中代码都经过运行并且没有bug
//用作排序的数组
static int[] sortArray = { -1, 8, 12, 20, 19, 33, 1, 7, 6 };
//增量数组
static int[] dlta = { 5,3,1};
/// <summary>
/// 希尔排序
/// </summary>
/// <param name="R">排序的数组</param>
/// <param name="dlta">增量数组</param>
/// <param name="t">增量数组长度</param>
private static void ShellSort(int[] R, int[] dlta, int t)
{//增量为dlta[]的希尔排序
for (int k = 0; k < t; k++)
{
ShellInsert(R, dlta[k]);
}
}
/// <summary>
/// 给定增量后的每次排序
/// </summary>
/// <param name="R">排序的数组</param>
/// <param name="dk">增量</param>
private static void ShellInsert(int[] R, int dk)
{
for (int i = dk+1; i < R.Length; i++)
{
if (R[i] < R[i - dk])
{
R[0] = R[i];//暂存在R[0]
int j = 0;
for (j = i-dk; j > 0&&R[0]<R[j]; j-=dk)
{
R[j + dk] = R[j];//记录后移,查找插入位置
}
R[j + dk] = R[0];//插入
}
}
}
/// <summary>
/// 显示数组
/// </summary>
private static void ShowSortArray()
{
for (int i = 1; i <= sortArray.Length - 1; i++)
{
Console.Write(sortArray[i] + " ");
}
Console.WriteLine();
}
static void Main(string[] args)
{
ShellSort(sortArray, dlta,dlta.Length);
ShowSortArray();
Console.ReadKey();
}
时间复杂度:不作具体讨论,但是T(n)<O(n^2)