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