資料結構與演算法——歸併排序
歸併排序以O(NlogN)最壞情形執行時間執行;這個演算法是經典的分治策略,它將問題分成一些小的問題然後遞迴求解,而治的階段則是將分的階段解得的各答案修補在一起。分治是遞迴非常有力的方法。
基本思路:
原始碼:
/*************************************************************************
> File Name: merge_sort.cpp
> Author:
> Mail:
> Created Time: 2016年01月11日 星期一 15時16分26秒
************************************************************************/
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
template<class T>
void merge(vector<T> & a, vector<T> & tmpArray, int leftPos, int rightPos, int rightEnd)
{
int leftEnd = rightPos - 1;
int tmpPos = leftPos;
int numElements = rightEnd - leftPos + 1;
while(leftPos <= leftEnd && rightPos <= rightEnd){
if(a[leftPos] <= a[rightPos])
tmpArray[tmpPos++] = a[leftPos++];
else
tmpArray[tmpPos++] = a[rightPos++];
}
while(leftPos <= leftEnd)
tmpArray[tmpPos++] = a[leftPos++];
while(rightPos <= rightEnd)
tmpArray[tmpPos++] = a[rightPos++];
for (int i = 0; i < numElements; i++, rightEnd--)
a[rightEnd] = tmpArray[rightEnd];
}
template<class T>
void mergeSort(vector<T> &a, vector<T> & tmpArray, int left, int right)
{
if (left < right){
int center = (left+right)/2;
mergeSort(a, tmpArray, left, center);
mergeSort(a, tmpArray, center+1, right);
merge(a, tmpArray, left, center+1, right);
}
}
template<class T>
void mergeSort(vector<T> & a)
{
vector<T> tmpArray(a.size());
mergeSort(a, tmpArray, 0, a.size()-1);
}
int main()
{
vector<int> v;
v.push_back(12);
v.push_back(8);
v.push_back(3);
v.push_back(8);
v.push_back(10);
v.push_back(1);
v.push_back(2);
v.push_back(14);
v.push_back(15);
v.push_back(9);
v.push_back(7);
v.push_back(4);
cout << "v: ";
copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
cout << endl;
mergeSort(v);
cout << "mergeSorted v: ";
copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
cout << endl;
return 0;
}
相關文章
- 【資料結構與演算法】歸併排序資料結構演算法排序
- 資料結構與演算法——排序演算法-歸併排序資料結構演算法排序
- 演算法與資料結構高階排序演算法之歸併排序演算法資料結構排序
- 演算法與資料結構系列 ( 七 ) - 歸併排序- Merge Sort演算法資料結構排序
- 資料結構:歸併排序(非遞迴)資料結構排序遞迴
- 【Java資料結構與演算法】第八章 快速排序、歸併排序和基數排序Java資料結構演算法排序
- 演算法:排序連結串列:歸併排序演算法排序
- (戀上資料結構筆記):歸併排序(Merge Sort)資料結構筆記排序
- 資料結構與演算法——排序資料結構演算法排序
- 【資料結構與演算法】高階排序(希爾排序、歸併排序、快速排序)完整思路,並用程式碼封裝排序函式資料結構演算法排序封裝函式
- 資料結構與演算法——歸併排序: 陣列&連結串列&遞迴&非遞迴解法全家桶資料結構演算法排序陣列遞迴
- 資料結構與演算法(八):排序資料結構演算法排序
- 資料結構與演算法之排序資料結構演算法排序
- 資料結構與演算法:堆排序資料結構演算法排序
- 【資料結構與演算法】堆排序資料結構演算法排序
- 資料結構與演算法——堆排序資料結構演算法排序
- 資料結構與演算法----# 一、排序資料結構演算法排序
- 排序演算法__歸併排序排序演算法
- 排序演算法:歸併排序排序演算法
- 排序演算法 - 歸併排序排序演算法
- 排序演算法(歸併排序)排序演算法
- 歸併排序--排序演算法排序演算法
- [資料結構與演算法] 排序演算法資料結構演算法排序
- 資料結構與演算法——排序演算法-基數排序資料結構演算法排序
- 資料結構與演算法——排序演算法-氣泡排序資料結構演算法排序
- 資料結構與演算法——排序演算法-選擇排序資料結構演算法排序
- 資料結構與演算法 排序與搜尋資料結構演算法排序
- 資料結構與演算法 基礎排序資料結構演算法排序
- 資料結構與演算法 進階排序資料結構演算法排序
- Java資料結構與排序演算法 (三)Java資料結構排序演算法
- Java資料結構與排序演算法 (一)Java資料結構排序演算法
- Java資料結構與排序演算法 (二)Java資料結構排序演算法
- 資料結構與演算法-反轉排序資料結構演算法排序
- 資料結構與演算法之快速排序資料結構演算法排序
- 排序演算法之 '歸併排序'排序演算法
- 資料結構與演算法整理總結---排序 2資料結構演算法排序
- 資料結構與排序資料結構排序
- 看圖輕鬆理解資料結構與演算法系列(合併排序)資料結構演算法排序
- 資料結構與演算法——十個排序演算法資料結構演算法排序