排序——合并(归并)排序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序——合并(归并)排序相关的知识,希望对你有一定的参考价值。
原理图:
实现代码:
#define MAX 1000 //合并区间a[left,middel]和a[middle+1,right] void Merge(int a[],int left,int middle,int right) { int pleft=left; //给左右区间分别加上游标 int pright=middle+1; int b[MAX]; int pb=0; while(pleft<=middle && pright<=right)//任何一个区间全部合并,结束循环 { if(a[pleft]<=a[pright]) { b[pb++] = a[pleft++]; //将a[pright]添加到数组b,并移动pright至下一个位置 } else //a[pleft] > a[pright] { b[pb++] = a[pright++]; } } while(pleft<=middle) { b[pb++] = a[pleft++]; } while(pright<=right) { b[pb++] = a[pright++]; } //再将合并成的数组b重新拷回给a int i,j; for(i=0,j=left;i<pb;i++,j++) { a[j] = b[i]; } } //将数组a[left,right]分成两个区间分别排序,然后合并 void MergeSort(int a[],int left,int right) { int middle; if(left<right) //如果当前子区间只有一个元素就不再继续划分子区间了,这时MergeSort()会被跳过,直接执行Merge合并 { middle = (left+right)/2; MergeSort(a,left,middle); //对左区间进行排序 MergeSort(a,middle+1,right); //对右区间进行排序 Merge(a,left,middle,right); //合并线性表的原理,合并两个有序的区间 } }
以上是关于排序——合并(归并)排序的主要内容,如果未能解决你的问题,请参考以下文章