ソートアルゴリズムソート比較的安定なソートアルゴリズムの数で考慮マージ、時間複雑度はnlognであり、分割統治の概念を取る、より効率的なソートアルゴリズムであると言うことができます。
長さLEN LENのアレイを開始すると、次のように組み合わせに従って昇順の開始、長さ1のサブシーケンスに分割される:
ポジティブに組み込まれ、配列の長さは同じ長さの配列であることができるまで。
以下は、非再帰的な実装コードです:
#include <iostream>
#include<vector>
using namespace std ;
void merge(vector<int>&ls, vector<int>&tmp, int l, int m, int r) {
int left = l ;
int k = l ;
int mid = m+1 ;
//将当前段的元素转移到tmp数组中相应位置
while(left<=m&&mid<=r) {
if(ls[left] > ls[mid]) {
tmp[k++] = ls[mid++];
}
else {
tmp[k++] = ls[left++] ;
}
}
if(left <= m) {
while(left <= m) {
tmp[k++] = ls[left++] ;
}
}
else {
while(mid<=r) {
tmp[k++] = ls[mid++] ;
}
}
}
void mergePass(vector<int>&ls, vector<int>&tmp, int s, int n) {
int i= 0;
while(i<=n-2*s) {
//将前一组长度为s个元素合并
merge(ls, tmp, i, i+s-1, i+2*s-1) ;
i = i+2*s ;
}
//剩余的元素少于3s的话
if(i+s<n) {
merge(ls, tmp, i, i+s-1, n-1) ;
}
else {
for(int k=i; k<=n-1; k++) {
tmp[k] = ls[k] ;
}
}
}
//合并排序非递归
void mergeSort(vector<int>&ls) {
vector<int>tmp =ls ;
int s= 1 ;
int len = ls.size();
while(s<len) {
mergePass(ls, tmp, s, len) ;
s+=s ;
mergePass(tmp, ls, s, len) ;
s+=s ;
}
}
int main()
{
vector<int>ls ;
while(1) {
int n ;
cin >> n ;
if(n == -1) {
break ;
}
ls.push_back(n) ;
}
mergeSort(ls) ;
for(int i=0; i<(int)ls.size(); i++) {
cout << ls[i] <<" " ;
}
return 0;
}