插入排序
插入排序跟冒泡排序有些相似,所以有些人在使用的时候经常会混淆。
就我个人而言,区分插入排序和冒泡排序最快的方法就是:冒泡排序直到算法结束后,才知道排序完成。而插入排序则不同,外循环每增加1,就能够知道前n个数是排序好的。所以同样的无序数组,使用插入排序比较数的次数会比冒泡排序少许多。
插入排序从i=1开始,直到i<n结束(数组array[n],array[0]是第一项,array[1]是第二项),当存在array[i-1]>array[i]时,交换两者的顺序。不过由于交换的原因,可能会造成左侧已经排序好的数组再次出现无序情况,因此要继续比较,直到前i项的数组都已排序好。
public class Test
{
private static void InsertionSort(int[] array)
{
for (int i = 1; i < array.Length; i++)
{
if (array[i - 1] > array[i])
{
int temp = array[i];
array[i] = array[i - 1];
int j = i - 1;
while (j > 0 && array[j - 1] > temp)
{
array[j] = array[j - 1];
j--;
}
array[j] = temp;
}
}
}
public static void Main()
{
int[] a = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
Console.Write("before: ");
for (int i = 0; i < a.Length; i++)
Console.Write(a[i] + " ");
Console.WriteLine("");
InsertionSort(a);
Console.Write("after: ");
for (int i = 0; i < a.Length; i++)
Console.Write(a[i] + " ");
}
}