非再帰的マージソートの概要

ソートアルゴリズムソート比較的安定なソートアルゴリズムの数で考慮マージ、時間複雑度は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;
}

おすすめ

転載: blog.csdn.net/qq_41681241/article/details/88692972