您的位置:首页 > 其它

归并排序

2015-11-05 09:48 501 查看
// 归并排序,理解起来不是特别难,只是代码修改的让我头疼,足足找了两个多小时才找到错误。
// 归并排序


#include
#include
using namespacestd;

// 对归并排序的整体理解,就是把数组不停的分割,直到分割成一个个的元素,然后再进行整合,整合的过程类似与一个倒置的二叉树
void Mersge( int * SR ,int * TR ,int s ,int m ,int _length){
int j,k,l;
for( j=m+1 , k=s; j<=_length && s<=m ; k++){
if(SR[s]<SR[j]){
cout<<s<<"s~~"<<SR[s]<<endl;
TR[k] = SR[s++];
//  cout<<"TR["<<k<<"] = "<<TR[k]<<endl;
}
else{
cout<<j<<"j~~"<<SR[j]<<endl;
TR[k] = SR[j++];
//   cout<<"TR["<<k<<"] = "<<TR[k]<<endl;
}
}
if(s<=m){
cout<<"k~~"<<k<<endl;
for(l=0 ; l<=m-s+1 ; l++){
TR[k++] = SR[s++];
cout<<s<<"_s~~"<<SR[s-1]<<endl;
//     cout<<"TR["<<k<<"] = "<<TR[k]<<endl;
}
}
if(j<=_length){
cout<<"k~~"<<k<<endl;
for(l=0 ; l<=_length-j+1 ; l++){
TR[k++] = SR[j++];
cout<<j<<"_j~~"<<SR[j-1]<<endl;
//        cout<<"TR["<<k<<"] = "<<TR[k]<<endl;
}
}
for(int p=1;p<=k;p++)
cout<<"TR[p]"<<TR[p]<<" ";
cout<<endl;
}

void Msort(int * SR ,int * TR ,int s ,int _length ){
int m;// Midle
int TR2[_length+1];
if(s == _length){  //这时候s等于1 ,Msort到了最后拆分的只有一个数组的时候
TR[s] = SR[s];
}
else{                                                  //s=1
m = (s+_length)/2;    //  这样会把sr分割得刚好比tr多一个元素,将sr分为sr[1,m]与sr[m=1,_length]两部分
Msort( SR, TR2, s, m);//将sr[1,m]归并为有序的 TR2[1,m]
Msort( SR, TR2, m+1, _length);//将sr[m+1,_length]归并为有序的TR2[m+1,_length];

// 将递归得到的 TR2[1,_length]归并为有序的 TR[1,_length],而上变的两个TR2从m分开来使用
Mersge(TR2, TR, s, m, _length);
}
}

void _MergeSort(int* _arr,int _length){
Msort(_arr,_arr,1,_length);
}

int main(int argc,constchar * argv[]) {
//    int a=1;
//    int b=2;
//    _swap(&a,&b);
//    cout<<a<<" "<<b<<endl;

int arr[] = {0,9,6,5,7,11,34,2,8,1,10};   //第一个元素必须置空,因为二叉树里没有第0个元素,0*2永远=0
int length =sizeof(arr)/sizeof(*arr);

_MergeSort(arr,length-1);

for(int i=1 ; i<length ; i++)
cout<<arr[i]<<" ";
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: