直接插入排序是一种简单直观的排序算法。
工作原理:
①、将数组分成两部分,一部分为以排序数组,一部分为待排序数组。
②、将待排序数组的第一个元素与以排序数组的最后一个元素进行比较,若待排序数组的第一个元素比以排序数组的最后一个元素小(从小到大排序),就将其与之前的元素进行比较,直到将他放到合适的地方。然后将已排序数组加一,待排序数组减一。
③、重复②操作。
看代码:
static void Main(string[] args)
{
int[] arr = { 12, 3, 456, 21, 7, 32, 43 };
ChaRu(arr);
}
public static void ChaRu(int[] arr)
{
//假设数组的第一位已经有序,从第二个开始向前比较
//插入排序遍历的次数
for (int i = 1; i < arr.Length; i++)
{
//比较次数
for (int j = i; j > 0; j--)
{
if (arr[j] < arr[j - 1])
{
int temp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = temp;
}
}
}
for (int i = 0; i < arr.Length; i++)
{
Console.Write(arr[i] + " ");
}
}
运行结果为:
时间复杂度分析:
最好情况下全部元素已经有序,但是我们还要把第一个之后的所有元素与之前的元素比较一下,时间复杂度为O(n);
最坏情况下全部元素都无序,我们放第二个元素时,需要与第一个进行比较并交换,第三个时需要比较第一、二个,以此类推,时间复杂度为O(n^2);
平均时间复杂度均为O(n^2);
算法的稳定性:
算法过程中按顺序取出元素然后插入到相应的位置,不会破坏其他的排序顺序,是稳定排序。
算法适用的场合:
简单排序中直接插入排序最好,快速排序最快,当文件基本有序时,冒泡和直接插入排序最佳。