归并排序的思想集中体现在:归和并上。归是指使用递归(分治)的思想,并是指分到最小单元的时候,开始合并。
废话不多说,直接贴代码,有问题欢迎评论讨论。
代码如下,经验证和冒泡排序结果一致。
#include<iostream>
using namespace std;
#define N 12
//并
void Merge(int *a,int left,int middle,int right)
{
int i=left;
int j=middle+1;
int k=0;
int *tmp = new int[right - left +1];
while(i <= middle && j<= right)
{
if(a[i] < a[j])
{
tmp[k++]=a[i++];
}
else
{
tmp[k++]=a[j++];
}
}
while(i<=middle)
{
tmp[k++] = a[i++];
}
while(j<= right)
{
tmp[k++] = a[j++];
}
for(int m=0,n=left;m<right - left +1;m++,n++)
{
a[n] = tmp[m];
}
delete[] tmp;
}
//归
void MergeSort(int *a,int left,int right)
{
if(left == right)
return;
int middle = left + ((right - left)>>1);
MergeSort(a,left,middle);
MergeSort(a,middle+1,right);
Merge(a,left,middle,right);
}
void BubbleSort(int *a, int length)
{
for(int i=length-1;i>=0;i--)
{
for(int j=0;j+1<i;j++)
{
if(a[j]>a[j+1])
{
int swap=a[j+1];
a[j+1] = a[j];
a[j] = swap;
}
}
}
}
void ArrayCopy(int *a, int *b, int length)
{
for(int i=0;i<length;i++)
{
b[i] = a[i];
}
}
void printArray(int *a, int length)
{
for(int i=0;i<length;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
}
int main()
{
int input[N]={5,4,3,2,1,7,9,8,0,11,15,21};
int cinput[N]={0},cinput2[N]={0},cinput3[N]={0};
ArrayCopy(input,cinput,N);
MergeSort(input,0,N-1);
BubbleSort(cinput,N);
printArray(input,N);
printArray(cinput,N);
return 0;
}