归并排序
基本概念
如图
##就是将一个无序数组分成两部分将这两部分排好序以后再合并,二分以后的数组也采用同样的方法进行排序。这里用到了递归的思想
流程图(转载的)
1.一个Merge()函数用来合并
2.一个MergeSort()函数实现归并排序,递归实现
void MergeSort(int a[],int b[],int l,int r)
{
int mid;
if(l<r)
{
mid=(l+r)/2;
//mid左边进行归并排序
MergeSort(a,b,l,mid);
//mid右边进行归并排序
MergeSort(a,b,mid+1,r);
//合并两个排好序的数组
Merge(a,b,l,mid,r);
}
}
void Merge(int a[],int b[],int l,int mid,int r)
{
//类似于单链表顺序合并的算法
int i=l;
int j=mid+1;
int k=l;
//当mid左右两个数组都没到尾时候
while(i!=mid+1 && j!=r+1)
{
//mid左右两个数比较
//小的数放到b数组
//同时被拿出数字的那个组的下标自增(++)
if(a[i]>a[j])
b[k++]=a[j++];
else
b[k++]=a[i++];
}
//mid左边表没有结束,右边已经结束
while (i!=mid+1)
{
b[k++]=a[i++];
}
//mid右边表没有结束,左边表已经结束
while(j!=r+1)
{
b[k++]=a[j++];
}
for(i=l;i<=r;i++)
{
a[i]=b[i];
}
}
代码如下
#include <stdio.h>
#include <stdlib.h>
void Merge(int a[],int b[],int l,int mid,int r)
{
int i=l;
int j=mid+1;
int k=l;
while(i!=mid+1 && j!=r+1)
{
if(a[i]>a[j])
b[k++]=a[j++];
else
b[k++]=a[i++];
}
while (i!=mid+1)
{
b[k++]=a[i++];
}
while(j!=r+1)
{
b[k++]=a[j++];
}
for(i=l;i<=r;i++)
{
a[i]=b[i];
}
}
void MergeSort(int a[],int b[],int l,int r)
{
int mid;
if(l<r)
{
mid=(l+r)/2;
MergeSort(a,b,l,mid);
MergeSort(a,b,mid+1,r);
Merge(a,b,l,mid,r);
}
}
int main()
{
int a[8]={50,10,20,30,70,40,80,60};
int i;
int b[8];
MergeSort(a,b,0,7);
for(i=0;i<8;i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}