码迷,mamicode.com
首页 > 其他好文 > 详细

算法系列——归并排序

时间:2014-07-14 09:24:53      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   os   数据   for   

归并排序基本思路就是将数组分成二组A,B,如果这二组组内的数据都是有序的,那么就可以很方便的将这二组数据进行排序。如何让这二组组内数据有序了?

可以将A,B组各自再分成二组。依次类推,当分出来的小组只有一个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的二个小组就可以了。这样通过先递归的分解数列,再合并数列就完成了归并排序。

 

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <math.h>
using namespace std;

void print(int a[],int n){
    for(int i=0;i<n;i++)
        cout<<a[i]<<" ";
    cout<<endl;
}

//将有二个有序数列a[first...mid]和a[mid+1...last]合并。  
void mergearray(int a[], int first, int mid, int last, int temp[])  
{  
    int i=first,m=mid;
    int j=mid+1,n=last;
    int k=0;
    while(i<=m && j<=n){
        if(a[i]<a[j]){
            temp[k++]=a[i];
            i++;
        }else{
            temp[k++]=a[j];
            j++;
        }
    }        
    while(i<=m){
            temp[k++]=a[i];
            i++;
    }
    while(j<=n){
        temp[k++]=a[j];
        j++;
    }
    // copy back to a
    for(int i=0;i<k;i++){
        a[first+i]=temp[i];
    }
}  
void mergesort(int a[], int first, int last, int temp[])  
{  
    if(first<last){
        int mid=(first+last)/2;
        mergesort(a,first,mid,temp);
        mergesort(a,mid+1,last,temp);
        mergearray(a, first, mid, last, temp);
    }
}  
  
int main()
{
        //测试
    int N = 10;
    int A[]={9,12,17,30,50,20,60,65,4,19};
    int B[]={9,12,17,30,50,4,20,60,65,70};
    int *temp=new int[N];
    
    mergesort(A,0,N-1,temp);
    print(temp,N);
    return 0;
}

 

归并排序的效率是比较高的,设数列长为N,将数列分开成小数列一共要logN步,每步都是 一个合并有序数列的过程,时间复杂度可以记为O(N),故一共为O(N*logN)。因为归并排序每次都是在相邻的数据中进行操作,所以归并排序在 O(N*logN)的几种排序方法(快速排序,归并排序,希尔排序,堆排序)也是效率比较高的。

 

 

算法系列——归并排序,布布扣,bubuko.com

算法系列——归并排序

标签:style   blog   color   os   数据   for   

原文地址:http://www.cnblogs.com/corolla/p/3839958.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!