數據結構之排序(一)

歸併排序

歸併:就是將兩個或兩個以上的有序表合成一張新的有序表。

兩路歸併算法的基本思想:設有兩個有序表A和B,其數據長度分別爲n,m,變量i和j分別爲AB表當前檢測指針,設C爲歸併後的新有序表,變量k爲當前存放指針。開始時,i,j,k分別指向表的起始位置,依次比較A[i]與B[j]的大小,將小的(假設此處爲遞增有序)存入C[k]中,之後i(或j)和k加一,如此反覆直到A和B表中有一個指針(i或j)已經到達表尾,則將另一表剩下的元素全部加入C表中。

template<class ElemType>
void Merge(ElemType elem[],int low,int mid,int high){
    ElemType *tmpElem=new ElemType[high+1];//定義臨時數組
    int i=low,j=mid+1,k=low;
    while(i<=mid&&j<=high)
         if(elem[i]<=elem[j])
              tmpElem[k++]=elems[i++];
         eles
              tmpElem[k++]=elems[j++];
   while(i<=mid)
         tmpElem[k++]=elem[i++];
   while(j<=high)
         tmpElem[k++]=elem[j++];
   for(i=low;i<=high;i++)
         elem[i]=tmpElem[i]
   delete []tmpElem;
}

兩路歸併排序:就是利用兩路歸併算法進行排序。

兩路歸併排序基本思想:假定初始數據表中有n個數據元素,首先把它看成是長度爲1的首尾相接的n個有序子表(歸併項),先做兩兩歸併,得n/2想上取整個長度爲2的歸併項(如果n爲奇數,則最後一項爲1);再做兩兩歸併。。。。如此反覆,最後得到以一個長度爲n有序序列。剛開始len等於1,之後每次翻倍

template<class ElemType>
voud MergeSort(ElemType elem[],int n)
{
    int len=1,i;
    while(len<n){
        i=0;
        while(i+2*len<=n){
            Merge(elem,i,i+len-1,i+2*len-1);
            i+len*2;
        }
        if(i+len<n)}
            Merge(elem,i,i+len-1,n-1);
        }
        len*=2;
    }
}

時間複雜度:O(nlog2n)

空間複雜度:O(n)

兩路歸併排序是一個穩定的排序方法。


基數排序--桶排序

例子:撲克牌排序。

比如存儲三位數字的數組排序,先按個位的遞增順序排,再按十位到百位排,最終得到基數排序後的有序序列。

時間複雜度:O(d(n+radix))

空間複雜度:附加的存儲空間是爲每個數據元素結點增設的鏈接指針,及爲每一個隊列設置的隊頭和隊尾,總共爲n+2*radix

基數排序中不需要移動數據元素,並且它是一種穩定的排序方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章