插入排序和归并排序(算法学习1)

插入排序和归并排序使我们见得比较多的排序算法,插入排序的时间复杂度是O(n2),空间复杂度为1。归并排序的时间复杂度为O(lgn),空间复杂度为n。下面为自己c语言实现的归并排序和插入排序。

 1 #include<stdio.h>
 2 void mergeSort(int a[],int p,int r);
 3 void merge(int a[],int p,int q,int r);
 4 void insertSort(int a[]);
 5 int main()
 6 {
 7     int a[9]={9,5,8,6,2,3,1,4,7};    
 8     mergeSort(a,0,8);//归并
 9     insertSort(a);//插入
10     for(int i=0;i<9;i++)
11         printf("%d ",a[i]);
12     return 0;
13 }
14 void mergeSort(int a[],int p,int r)//归并排序
15 {
16     if(p<r)
17     {
18         int q=(p+r)/2;
19         mergeSort(a,p,q);
20         mergeSort(a,q+1,r);
21         merge(a,p,q,r);
22     }
23 }
24 void merge(int a[],int p,int q,int r)//合并
25 {
26     int l[9],m[9];
27     int n1=q-p+1;
28     int n2=r-q;
29     int i,j,k;
30     j=k=0;
31     for(i=p;i<=q;i++)        
32         l[j++]=a[i];
33     for(i=q+1;i<=r;i++)        
34         m[k++]=a[i];
35     l[n1]=m[n2]=999;
36     i=j=0;
37     for(k=p;k<=r;k++)
38     {        
39         if(l[i]>m[j])
40             a[k]=m[j++];
41         else a[k]=l[i++];
42     }
43 
44 }
45 void insertSort(int a[])//插入排序
46 {
47     int i,j,s,tem,p;
48     for(i=1;i<9;i++)
49     {
50         tem = a[i];
51         p=i;//标记
52         s=i;
53         while(a[p-1] > tem)
54         {
55             p=p-1;
56             if(p==0)
57                 break;
58         }//p确定最后tem放置的位置
59         for(j=i;j>p;j--)
60         {
61             a[j]=a[j-1];
62         }
63         a[p]=tem;        
64     
65     }
66 }

虽然插入排序的最坏时间比归并排序多,但是在n比较小时插入排序的速度比归并排序的速度快。所以在归并排序中当子问题足够小时,就可以用插入排序来处理子问题的排序,从而提高归并排序的效率。当子问题的大小为小于lgn时,采用插入排序来处理子问题能够提高归并排序的效率。

lgn的确定具体请看http://fangxia722.blog.163.com/blog/static/317290122009112831244671/

 

posted @ 2013-12-09 20:39  weilq  阅读(408)  评论(0编辑  收藏  举报