归并排序

xiaoxiao2021-02-28  128

归并排序 基本思想 一、递归

//归并 void merge(int *arr,int * tmp,int left,int mid,int right) { int begin1=left; int end1=mid; int begin2=mid+1; int end2=right; int idx=left; while(begin1<=end1&&begin2<=end2) { if(arr[begin1]<=arr[begin2]) tmp[idx++]=arr[begin1++]; else tmp[idx++]=arr[begin2++]; } while(begin1<=end1) tmp[idx++]=arr[begin1++]; while(begin2<=end2) tmp[idx++]=arr[begin2++]; } void _merge(int *arr,int *tmp,int left,int right) { if(left<right) { int mid=(left+right)>>1; _merge(arr,tmp,left,mid); _merge(arr,tmp,mid+1,right); merge(arr,tmp,left,mid,right); memcpy(arr+left,tmp+left,sizeof(arr[0])*(right-left+1)); } } void merge_sort(int *arr,int size) { if(arr==NULL||size<=0) return ; int *tmp=new int[size]; _merge(arr,tmp,0,size-1); delete[] tmp; }

二、非递归

void merge_nor(int *arr,int size) { int *tmp=new int[size]; int left=0; int right=size-1; int gap=1; while(gap<size) { for(int idx=0;idx<size;idx+=gap*2) { left=idx; int mid=left+gap-1; right=mid+gap; if(mid>=size) mid=size-1; if(right>=size) right=size-1; merge(arr,tmp,left,mid,right); } memcpy(arr,tmp,size*sizeof(int)); gap<<=1; } delete[] tmp; }
转载请注明原文地址: https://www.6miu.com/read-49958.html

最新回复(0)