算法之合併排序

合併排序算法是用分治策略實現對n個元素進行排序的算法。

基本思想:將待排序元素分成大小大致相同的兩個子集合,分別對兩個子集合進行排序,最終將排好序的子集合合併成要求的排好序的集合。

歸併操作的工作原理如下:
    第一步:申請空間,使其大小爲兩個已經排序序列之和,該空間用來存放合併後的序列
    第二步:設定兩個指針,最初位置分別爲兩個已經排序序列的起始位置
    第三步:比較兩個指針所指向的元素,選擇相對小的元素放入到合併空間,並移動指針到下一位置
    重複步驟3直到某一指針超出序列尾

    將另一序列剩下的所有元素直接複製到合併序列尾


#include <iostream>
#include <string.h>
using namespace std;
//合併算法
void Merge(int a[],int left,int middle,int right)//0 3 7 4+4
{

    int lsize=middle-left+1,rsize=right-middle;
    int la[lsize],ra[rsize];
    memcpy(la,a+left,sizeof(int)*lsize);
    memcpy(ra,a+middle+1,sizeof(int)*rsize);
    int i=0,j=0,k=left;
    while(i<lsize&&j<rsize)
    {
        if(la[i]<ra[j])
        {
            a[k++]=la[i++];
        }
        else a[k++]=ra[j++];
    }
    while(i<lsize)a[k++]=la[i++];
    while(j<rsize)a[k++]=ra[j++];
    delete la;
    delete ra;
}

void MergeSort(int num[],int left,int right)//遞歸合併排序
{
    if(left>=right)return;
    int middle = (left+right)/2;
    MergeSort(num,left,middle);
    MergeSort(num,middle+1,right);
    Merge(num,left,middle,right);
}

int main()
{
    int num[] = {5,1,9,10,2,18,6,0};
    MergeSort(num,0,7);
    for(int i=0;i<8;i++)
        cout<<num[i]<<" ";
}
/*
    1 3 6 4 9 2 0
    1 3 4 6 2 9 0
    1 3 4 6 0 2 9

*/

複雜性分析:最壞情況下,每次執行合併操作耗費O(n)時間,共需要遞歸O(logn)次,所以最壞情況下時間複雜性爲O(nlogn);

發佈了44 篇原創文章 · 獲贊 8 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章