插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而形成一个新的、记录数增1的有序表。在其实现过程中使用双层循环,外层循环对处理第一个元素之外的所有元素前面有序进行待插入位置查找,并进行移动。
活动地址:CSDN21天学习挑战赛
插入排序的工作方式像许多人排序一手扑克牌。开始时,我们的左手为空并且桌子上的牌面向下。然后,我们每次从桌子上拿走一张牌并将它插入到左手中正确的位置。为了找到一张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较。拿在左手上的牌总是排序好的,原来这些牌是桌子上牌堆中顶部的牌。
插入排序是指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是一个排好顺序的。按照此方法对所有元素进行插入,直到整个序列排为有序的过程,称为插入排序。
伪代码实现:
for j = 2 to A.length
key = A[j]//将A[j]插入到已排序序列A[1..j-1]
i = j - 1
while i > 0 and A[i] > key
A[i + 1] = A[i]
i = i - 1
A[i + 1] = key
示例数组依然用小山猪给的那个:a[10]={11,34,20,10,12,35,41,32,43,14}
C语言:
#include<stdio.h>
int main(){
int a[10]={11,34,20,10,12,35,41,32,43,14};//10,11,12,14
int key,i;
for(int j=1;j<10;j++){
key=a[j];
i=j-1;
while((i>=0)&&(a[i]>key)){
a[i+1]=a[i];
i--;
a[i+1]=key;
}
}
for( i=0;i<10;i++){
printf("%d\n",a[i]);
}
}
结果为:
再用Java实现一下:
public class cahrupaixu {
public static void main(String[] args) {
int[] a={11,34,20,10,12,35,41,32,43,14};
for(int j=1;j<a.length;j++){
int key=a[j];
int i=j-1;
while((i>=0)&&(a[i]>key)){
a[i+1]=a[i];
i--;
a[i+1]=key;
}
}
for(int i=0;i<a.length;i++){
System.out.printf("%d\n",a[i]);
}
}
}
结果为:
插入排序的平均时间复杂度O(n²);空间复杂度为O(1)。
插入排序适用于已经有部分数据排好,并且排好的部分越大越好。一般在输入规模大于1000的场合下不建议使用插入排序。
算法的优化:
二分法插入排序:直接插入排序每次插入按顺序依次往前查找,比较耗时且效率低。利用二分查找的方式,提升速度。
步骤:
①从第一个元素开始,该元素可以认为已经被排序
②取出下一个元素,在已经排序的元素序列中二分查找到第一个比它大的数的位置
③将新元素插入到该位置后
④重复上述两步