归并排序:
归并排序的核心思想是采用分治法,对已有序的子序列进行合并,从而得到一个有序的序列。
例如:两个已经有序的子序列:2,4,6,8与3,5,7,首先首元素也就是2与3比较,2小于3,把2放到最终的序列中,然后拿第一个序列中的4再与3比较,4大于3,于是把3放入最终的序列中,重复以上过程最终当把7放入最终的序列之后,第一个序列中还有8未放入,将8放入最终的子序列,归并结束,已成为一个有序的序列:2,3,4,5,6,7,8
void mergeData(int a[],int lenA,int b[],int lenB,int temp[])
{
int i=0;
int j=0;
int k=0;
while(i<=lenA&&j<=lenB){
if(a[i]>=b[j]){
temp[k++]=b[j++];
}
else{
temp[k++]=a[i++];
}
}
while(i<=lenA){
temp[k++]=a[i++];
}
while(j<=lenB){
temp[k++]=a[j++];
}
}
整个归并排序的过程一般使用递归来实现,首先将一个数组中的元素两两归并,成为若干个有序的子序列,再将这些子序列继续归并,得到最终的有序序列。
例如:4 3 5 2 7 8
第一次归并:(3 4) (2 5)(7 8)
第二次归并:(2 3 4 5)(7 8)
第三次归并: (2 3 4 5 7 8)
排序完成。
void mergeData(int data[],int first,int mid,int last,int temp[])
{
int i=first;
int j=mid+1;
int m=mid,n=last;
int k=0;
while(i<=m&&j<=n){
if(data[i]>=data[j]){
temp[k++]=data[j++];
}
else{
temp[k++]=data[i++];
}
}
while(i<=m){
temp[k++]=data[i++];
}
while(j<=n){
temp[k++]=data[j++];
}
for(i=0;i