原路归并排序

来源:互联网 发布:推荐算法有哪些 编辑:程序博客网 时间:2024/05/02 00:51
//原地归并排序不需要辅助数组即可归并。关键在于merge这个函数。#include<iostream>using namespace std;void reverse(int *data,int n){for(int i=0;i<n/2;i++){swap(data[i],data[n-i-1]);}}//将含有n个元素的E数组向左循环移位i个位置void exchange(int *data,int n,int i){reverse(data,i);reverse(data+i,n-i);reverse(data,n);}void merge(int *data,int start,int mid,int end){int i=start;int j=mid;int k=end;while(i<j&&j<=k){int step=0;while(i<j && data[i]<=data[j])++i;while(j<=k && data[i]>=data[j]){++j;++step;}//data+i为子数组的首地址,j-i为子数组元素的个数,j-i-step为左循环移位的个数exchange(data+i,j-i,j-i-step);i=i+step;//下一个比较的元素}for(int i=0;i<10;i++)cout<<data[i]<<" ";cout<<"\n"<<endl;}void MergeSort(int *data,int start,int end){if(start<end){int mid=(start+end)/2;MergeSort(data,start,mid);MergeSort(data,mid+1,end);merge(data,start,mid+1,end);}}void main(){int data[]={6,4,3,1,7,8,2,9,5,0};int len=sizeof(data)/sizeof(int);MergeSort(data,0,len-1);for(int i=0;i<len;i++)cout<<data[i]<<" ";cout<<endl;}

0 0
原创粉丝点击