(1)直接插入排序其基本思想是:一个有序区和一个无序区,每次扫描扩大有序区,将无序区的数据不断的加入到有序区中。
例如:49、38、65、97、76、13、27
第一趟排序:[13]、49、38、65、97、76、27
第二趟排序:[13、27]、49、38、65、97、76
第三趟排序:[13、27、38]、49、65、97、76
第。。。。。
直接插入排序是稳定的排序,直接插入排序,设置监哨,减少了交换语句。
![](/Images/OutliningIndicators/ContractedBlock.gif)
Code
int[] intArray = { 49,38,65,97,76,13,27};
protected void Page_Load(object sender, EventArgs e)
{
int[] result = Sort(intArray);
String output="";
for (int j = 0; j < result.Length; j++)
{
output += output.Equals("") ? result[j].ToString() : "," + result[j].ToString();
}
Response.Write(output);
}
public int[] Sort(int[] intArray)
{
int intTemp;
int j;
//默认第一个已排序
for (int i = 1; i < intArray.Length; i++)
{
intTemp = intArray[i];
j = i;
while (j > 0 && intArray[j - 1] > intTemp)
{
//如果当前值大于intTemp(有序前的最大值),则依次判断前面的序列插入到指定位置中
intArray[j] = intArray[j - 1];
j--;
}
intArray[j] = intTemp;
}
return intArray;
}
(2)希尔排序,是不稳定的排序,它先分组,经过几次排序后,使得组内元素基本有序,这样在进入最后一次插入排序进行插入排序时能够减少时间复杂度。它在最坏情况下的执行效率和在平均情况下的执行效率相比没有差很多。
小组排序在分组确定组的步长d,然后将R[d+1..n]分别插入各组当前的有序区。注意希尔排序中步长等于1的情况是一定要排序的否则会导致排序失败。
希尔排序(shellsort)又叫增量递减(diminishing increment)排序,是由D.L. Shell发明的,这个算法是通过一个逐渐减小的增量使一个数组逐渐趋近于有序从而达到排序的目的。
假设有一个数组int data[16] = {...}。 首先将这个增量设为16 / 2 = 8,这样就将这个数组分成了8个子数组,它们的索引是0, 8 1, 9 2, 10等等 。对这些子数组进行排序。然后再使增量为8 / 2 = 4,这样就将原数组分成了4个子数组,它们的索引分别是0, 4, 8, 12 1, 5, 9, 13等等。再对这四组数进行排序,直到增量为1。
以上所描述的增量递减只是一种方法,这种方法并不是最有效率的。如f(n) = 3 * f(n - 1) + 1 f(1) = 1 (..., 121, 40, 13, 4, 1)就比上面的取增量的方法好。这种方法的时间复杂度是O(n ^1.5)
![](/Images/OutliningIndicators/ContractedBlock.gif)
Code
using System;
namespace ShellSorter
{
public class ShellSorter
{
public void Sort(int [] list)
{
int inc;
for(inc=1;inc<=list.Length/9;inc=3*inc+1);
for(;inc>0;inc/=3)
{
for(int i=inc+1;i<=list.Length;i+=inc)
{
int t=list[i-1];
int j=i;
while((j>inc)&&(list[j-inc-1]>t))
{
list[j-1]=list[j-inc-1];
j-=inc;
}
list[j-1]=t;
} }
} }
public class MainClass
{ public static void Main()
{
int[] iArrary=new int[]{1,5,13,6,10,55,99,2,87,12,34,75,33,47};
ShellSorter sh=new ShellSorter();
sh.Sort(iArrary);
for(int m=0;m<iArrary.Length;m++)
Console.Write("{0} ",iArrary[m]);
Console.WriteLine();
} }
}