#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;
}
非递归的归并排序
最新推荐文章于 2022-04-23 20:20:33 发布