zoukankan      html  css  js  c++  java
  • 归并排序

    简介:
    归并排序的时间复杂度为O( n log n ),是一种速度仅次于快速排序的稳定排序算法。
     
    (题外话:虽然C++的STL中有sort()函数,但有些算法题用到了归并排序的思想,如求逆序数,因此归并排序是必须懂的。当然,网上关于归并排序的讲解很多,这里仅仅只是给出模板。)
     

    模板:

     1 void mergeArray(int *a,int l,int mid,int r,int *temp)
     2 {
     3     int i=l,j=mid+1;
     4     int k=0;
     5     
     6     while(i<=mid&&j<=r)
     7     {
     8         if(a[i]<=a[j])
     9             temp[k++]=a[i++];
    10         else
    11             temp[k++]=a[j++];
    12     }
    13     
    14     while(i<=mid)
    15         temp[k++]=a[i++];
    16     while(j<=r)
    17         temp[k++]=a[j++];
    18     
    19     for(int i=0;i<k;i++)
    20         a[l+i]=temp[i];    
    21 }
    22 
    23 void mergeSort(int *a,int l,int r,int *temp)
    24 {
    25     if(l<r)
    26     {
    27         int mid=(l+r)/2;
    28         mergeSort(a,l,mid,temp);
    29         mergeSort(a,mid+1,r,temp);
    30         mergeArray(a,l,mid,r,temp); 
    31     }
    32 } 

    题目:洛谷 P1177

    (虽然题目写着是快速排序的模板题,但也能当作是其他时间复杂度与快速排序不相上下的排序算法的模板题)

     1 const int Size = 1000000;
     2 int array[Size];
     3 int arrayCopy[Size];
     4 
     5 void mergeArray(int *a,int l,int mid,int r,int *temp)
     6 {
     7     int i=l,j=mid+1;
     8     int k=0;
     9     
    10     while(i<=mid&&j<=r)
    11     {
    12         if(a[i]<=a[j])
    13             temp[k++]=a[i++];
    14         else
    15             temp[k++]=a[j++];
    16     }
    17     
    18     while(i<=mid)
    19         temp[k++]=a[i++];
    20     while(j<=r)
    21         temp[k++]=a[j++];
    22     
    23     for(int i=0;i<k;i++)
    24         a[l+i]=temp[i];    
    25 }
    26 
    27 void mergeSort(int *a,int l,int r,int *temp)
    28 {
    29     if(l<r)
    30     {
    31         int mid=(l+r)/2;
    32         mergeSort(a,l,mid,temp);
    33         mergeSort(a,mid+1,r,temp);
    34         mergeArray(a,l,mid,r,temp); 
    35     }
    36 } 
    37 
    38 int main()
    39 {
    40     int n;
    41     cin>>n;
    42     for(int i=0;i<n;i++)
    43     {
    44         cin>>array[i];
    45     }
    46     mergeSort(array,0,n-1,arrayCopy);
    47     for(int i=0;i<n;i++)
    48     {
    49         cout<<array[i]<<" ";
    50     }
    51 } 
  • 相关阅读:
    多线程下单例模式:懒加载(延迟加载)和即时加载
    Java 线程同步
    java 多线程之wait(),notify,notifyAll(),yield()
    序列化和反序列化及线程实现方式
    错题解析
    错题解析
    考试:错题总结
    测试:错题总结
    hashCode与equals的区别与联系
    @Not
  • 原文地址:https://www.cnblogs.com/antarctic/p/11913625.html
Copyright © 2011-2022 走看看