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

本文提供了一段使用C语言实现的归并排序和插入排序算法的代码,详细介绍了这两种排序方法的时间复杂度和空间复杂度,并探讨了在归并排序中采用插入排序处理小规模子问题的可能性,以提升排序效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

插入排序和归并排序使我们见得比较多的排序算法,插入排序的时间复杂度是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/

 

转载于:https://www.cnblogs.com/weilq/p/3466077.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值