Non-recursive merge sort summary

Merge sort considered in a number of relatively stable sorting algorithm sorting algorithm, time complexity is nlogn, take the idea of divide and conquer, may be said to be more efficient sorting algorithms.
Start the array of length len len is divided into subsequences of length 1, starting ascending order according to combined as follows:
Here Insert Picture Description
until incorporated into a positive and a length of the array can be of equal length sequences.


The following is a non-recursive implementation code:

#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;
}

Guess you like

Origin blog.csdn.net/qq_41681241/article/details/88692972