归并排序非递归
1.算法思想
开始以间隔为1进行归并,也就是说,第一个元素跟第二个元素进行归并,第三个与第四个元素进行归并;
然后,再以间隔为2进行归并,第一个元素到第四个元素进行归并,第五个元素到第八个元素进行归并;
再以间隔2*2进行归并,同理,直到2*k超过数组长度为止。
2.具体代码
#include <iostream>
#include <vector>
#include <iterator>
using namespace std;
int min(int x, int y){
return (x < y) ? x : y;
}
vector<int> Merge(vector<int> &data, int begin, int mid, int end){
int n1 = mid - begin + 1;
int n2 = end - mid;
int left[n1], right[n2];
for(int i = 0; i < n1; i++){
left[i] = data[begin+i];
}
for(int i = 0; i < n2; i++){
right[i] = data[mid + i + 1];
}
int i = 0, j = 0, k = begin;
while(i < n1 && j < n2){
if(left[i] <= right[j]){
data[k++] = left[i++];
}else{
data[k++] = right[j++];
}
}
while(i < n1){
data[k++] = left[i++];
}
while(j < n2){
data[k++] = right[j++];
}
return data;
}
vector<int> MergeSort(vector<int> data){
vector<int> res;
if(data.empty()){
return res;
}
unsigned int i = 1;
while(i < data.size()){
for(unsigned int begin = 0; begin < data.size(); begin += 2*i){
int mid = begin + i - 1;
int end = min(begin + 2 * i -1, data.size()-1);
res = Merge(data, begin, mid, end);
}
i = 2 * i;
}
return res;
}
void printVec(vector<int> &vec){
if(vec.empty()){
return ;
}
for(vector<int>::iterator it = vec.begin(); it != vec.end(); it++){
cout<< *it << " ";
}
cout << endl;
}
int main()
{
int arr[] = {12, 11, 13, 5, 6, 7};
vector<int> vec(arr, arr + 6);
vector<int> res;
cout << "the origonal array:" << endl;
printVec(vec);
res = MergeSort(vec);
cout << "the merge sort array:" << endl;
printVec(res);
return 0;
}