排序问题(1)——插入排序

一. 基本思想与分析  
  插入排序通过两层循环嵌套来找到一个元素在数组中合适的位置,并通过将该元素之前的各元素前移来实现。
  插入排序时间复杂度为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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值