插入排序
如下图:如果此时要插入元素7,那么7比10小,10后移,然后7与5比,7比5大,所以7不用再移动位置
定义:
插入排序是指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。按照此法对所有元素进行插入,直到整个序列排为有序的过程,称为插入排序 。适用于待排序记录较少并且基本有序的情况。
代码实现:
class InsertSort { /// <summary> /// 升序 /// </summary> /// <param name="arr"></param> public static void Sort(int[] arr) { int n = arr.Length; //i=1是因为插入排序是从后往前比。比如下面数组,一开始是要将5默认为一个有序数组,从4开始跟5比。 //5 4 6 1 7 for (int i = 1; i < n; i++) { //插入元素e int e = arr[i]; //j表示元素e应该插入的位置 int j; for (j = i; j > 0; j--) { if (e < arr[j-1]) {
//因为插入的元素比有序数组中的某个值小,所以将有序数组中的这个值后移 arr[j] = arr[j - 1]; } else { //此时说明不用再比较了 break; } } //通过for循环判断,最终找到了j具体的位置,将元素e放在此位置上 arr[j] = e; } } }
性能对比
插入排序和冒泡排序还有选择排序都是O(n*n)的时间复杂度,因为都是有2层for循环,但是插入排序要比选择排序要好,是因为插入排序存在break跳出循环的一个动作,只要符合条件了,就可以跳出循环。对于近乎有序的数组其性能更高。