【資料結構】歸併排序!!!

doctor_xiong發表於2018-02-05

歸併排序
整體思想:將資料分成很多的部分,每次排序資料的一部分,然後將兩部分的資料進行整體排序,這樣一步一步將整體資料排序。
如圖:
這裡寫圖片描述
注:將需要排序的資料進行分塊,當每個塊的資料足夠的少的時候就可以進行效率高的排序方法,當兩塊資料排序好的時候就可以將兩塊排序好的資料進行合併。
具體實現方法:


#ifndef _MERGESORT_H
#define _MERGESORT_H
#include<iostream>
using namespace std;


template<class T>
void merge(T* arr,size_t start,size_t end,T* tmp){
    size_t left_length = (end - start +1)/2 + 1;
    size_t mid = start + left_length;
    size_t result_length = start;
    size_t right = mid;
    size_t left = start;
    while(left < mid && right <= end){
        if(arr[left] <= arr[right])
            tmp[result_length++] = arr[left++];
        else   
            tmp[result_length++] = arr[right++];
    }
    while(left < mid){
        tmp[result_length++] = arr[left++];
    }
    while(right <= end){
        tmp[result_length++] = arr[right++];
    }
}


template<class T>
void _mergesort(T* arr,size_t start,size_t end,T* tmp){
    if(NULL == arr)
        return ;
    size_t mid = (end-start+1)/2+start;
    if(end - start == 1){
        if(arr[start] > arr[end])
            swap(arr[start],arr[end]);
        return ;
    }
    else if(end - start == 0){
        return ;
    }
    else{
        _mergesort(arr,start,mid,tmp);
        _mergesort(arr,mid+1,end,tmp);
        merge(arr,start,end,tmp);
        for(size_t i = start;i <= end;i++)
            arr[i] = tmp[i];
    }
}
template<class T>
void mergesort(T* arr,size_t size){
    if(NULL == arr)
        return;
    T* tmp = new T[sizeof(T)*size];
    _mergesort(arr,0,size,tmp);
    delete[] tmp;
}

#endif

相關文章