非递归的归并排序

来源:互联网 发布:淘宝上的手办是真假 编辑:程序博客网 时间:2024/05/24 22:42
#include<cstring>#include<iostream>using namespace std;/*merge操作和递归的归并一样,就是数组链表两种方式都要熟悉!*/void merge(int a[], int left, int mid, int right, int tmp[]){    int i = left, j = mid+1,k = 0 ;    while(i<=mid&&j<=right){        if(a[i]>a[j])            tmp[k++] = a[j++];        else            tmp[k++] = a[i++];    }    while(i<=mid)        tmp[k++] = a[i++];    while(j<=right)        tmp[k++] = a[j++];    for(i = 0 ; i < k ; i++)        a[left+i] = tmp[i];}/*非递归的归并排序,就是先两个元素合并,然后四个、八个...*/void mergeSort(int a[], int length){    int size = 1, left, right, mid; //size 小组内每组个数,1.2.4.8....    int *tmp = new int[length]; //临时数组,在erge中使用,在merge中new会重复new,delete。优化    while(size <= length-1){        left = 0;        while(left+size <= length-1){            mid = left+size-1;            right = mid+size;            if(right>length-1)//右部超出数组大小,将右面的数组截断到最后一个元素。                right = length-1;            merge(a, left, mid, right, tmp);            left = right+1;        }        size*=2;    }}int main(){    int array[] = {2,5,1,-3,7,9,18,4,6};    mergeSort(array,9);    for(int i = 0 ; i< 9 ; i++)        cout<<array[i]<<" ";    return 1;}

0 0