zoukankan      html  css  js  c++  java
  • 插入排序和归并排序(算法学习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/

  • 相关阅读:
    Eclipse CDT Linux下内存分析 实战历险
    .Net元编程【Metaprogramming in NET】 序-翻译
    go语言和资料
    代码提交 【转】
    两本有意思的书【代码的未来、淘宝技术这十年】
    C/C++构建系统 GNU autotool
    C/C++构建系统 -工具汇总
    使用Java语言开发微信公众平台(四)——图文消息的发送与响应
    Onsen UI 前端框架(二)
    Maven项目搭建(一):Maven初体验
  • 原文地址:https://www.cnblogs.com/weilq/p/3466077.html
Copyright © 2011-2022 走看看