【數據結構】歸併排序!!!

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


#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
發佈了89 篇原創文章 · 獲贊 75 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章