一. 基本思想与分析
插入排序通过两层循环嵌套来找到一个元素在数组中合适的位置,并通过将该元素之前的各元素前移来实现。
插入排序时间复杂度为O(n^2),是一个稳定的排序算法。
二. 具体代码实现
#include<stdio.h>
int a[2000];
merge (int p,int q,int r){ //将分治后的两个数组合并为一个已完成排序的数组
int i,j,n1,n2,k;
int l1[1000],l2[1000]; //l1,l2为临时储存数组
n1=q-p+1;
n2=r-q;
for (i=0;i<n1;i++) {
l1[i]=a[p+i];
}
for (i=0;i<n2;i++) {
l2[i]=a[q+i+1];
}
l1[n1]=10000;//将数组后一元素设置为无穷大或无穷小以完成数组合并
l2[n2]=10000;
i=0;
j=0;
for (k=p;k<r+1;k++) {
if (l1[i]<=l2[j]) {
a[k]=l1[i];
i++;
}
else {
a[k]=l2[j];
j++;
}
}
}
merge_sort(int p,int r) {//分治递归来解决问题
int q;
if (p<r) {
q=(p+r)/2;
merge_sort(p,q);
merge_sort(q+1,r);
merge(p,q,r);
}
}
main(){
int n,i;
scanf("%d",&n);
for (i=0;i<n;i++) {
scanf("%d",&a[i]);
}
merge_sort(0,n-1);
for (i=0;i<n;i++) {
printf("%d ",a[i]);
}
return 0;
}