内部排序之 归并排序

归并排序

本文仅个人学习所得与理解

  1. 时间复杂度O(n*logn)(稳定的排序算法)
  2. 基本思路
    对于序列 a[] = {6, 9,10, 8, 1, 19, 4};
    1、每两个相邻元素一组,排序
    2、每4个一组,将第一步排好的相邻的两组有序区间 合并为一个有序区间
    3、以此类推。
    合并方法:
    如序列6 9 3 10,左半个区间有序,有半个区间有序,合并后就是3 6 9 10

  3. 代码实现
    递归法,基本思路所描述的逆过程

#include
using namespace std;
void split(int *a,int l,int r)//7
{
    int mid=(l+r)/2;
    if(l//先分裂区间
        split(a,mid+1,r);
    }
    int v[r-l+1],top=0;//辅助数组
    int low=l,high=mid+1;
    while(low<=mid||high<=r)//将两个有序区间合并
    {
        while(low<=mid&&(a[low]<=a[high]||high>r))
            v[top++]=a[low++];
        while(high<=r&&(a[low]>=a[high]||low>mid))
            v[top++]=a[high++];
    }
    for(int i=l;i<=r;i++)a[i]=v[i-l];
}
int main()
{
    int a[10]={49,38,65,27,79,98,12,42,100,9};
    split(a,0,9);
    for(int i=0;i<10;i++)
        printf("%d ",a[i]);
}

非递归法:

#include
using namespace std;
void MergeSort(int *a,int n)
{
    int v[n],top;
    for(int k=1;k2)//单组长度
    {
        for(int i=0;i2*k)//依次对每两个区间归并
        {
            top=0;
            int mid=min(n,i+k),high=min(n,i+2*k);
            int l=i,r=mid;
            while(l//归并
            {
                while(l=high||a[l]<=a[r]))
                    v[top++]=a[l++];
                while(r=mid||a[l]>=a[r]))
                    v[top++]=a[r++];
            }
            for(int j=i;jint main()
{
    int a[]={4,8,2,8,10,5};
    MergeSort(a,6);
    for(int i=0;i<6;i++)
        printf("%d ",a[i]);
}

你可能感兴趣的:(ACM**数据结构**)