归并排序这个算法,让我回忆到一道算法题目,就是两个有序的数组合并成一个有序的数组,相信经常刷题的同学一定很熟悉这个题目。
实际上归并排序就是把数组拆分成一个一个的元素,然后两两都是有序数组,再进行合并。
这里要说明的是,大话数据结构这本书中的归并排序(递归版)的代码我不是很推荐,代码相对而言较为复杂一点,不好理解。
和快排函数形式类似,我们也有三个函数。
void MergeSort(List *L);
void MSort(int arr[],int low,int high);
void Merge(int arr[], int low,int mid,int high);
MergeSort是入口函数,MSort是用来递归的函数,Merge是真正做事情的函数。
MergeSort很简单,只是一个入口
void MergeSort(List *L)
{
MSort(L->r,1,L->length);
}
接下来是MSort
void MSort(int arr[],int low,int high)
{
if(low >= high)
{
return;
}
int mid = low + (high - low)/2;
MSort(arr,low,mid);
MSort(arr,mid+1,high);
Merge(arr,low,mid,high);
}
MSort函数也是用来递归的,其一定有递归终止条件,就是low>=high,
low=high的时候意味这数组已经被拆成了只剩一个元素。首先MSort左半边,再MSort 右半边,最后Merge
Merge函数就很简单了,就是两个有序数组合并成一个数组
arr[low,m]是第一个数组,arr[m+1,high]是第二个数组。
void Merge(int arr[], int low,int mid,int high)
{
int i = low,j = mid+1,k=0;
int *temp = new int[high-low+1];
while(i <= mid&& j<=high)
{
if(arr[i] <= arr[j])
temp[k++] = arr[i++];
else
temp[k++] = arr[j++];
}
while(i<=mid)
{
temp[k++] = arr[i++];
}
while(j<=high)
{
temp[k++] = arr[j++];
}
for(i=low,k=0;i<=high;i++,k++)//将排好序的存回arr中low到high这区间
arr[i]=temp[k];
delete []temp;//释放内存,由于指向的是数组,必须用delete []
}
#include
#define MAXSIZE 10000
typedef struct
{
int r[MAXSIZE];
int length;
}List;
void swap(List*l,int i,int j);
void print(List *l);
void Merge(int arr[], int low,int mid,int high);
void MSort(int arr[],int low,int high);
void MergeSort(List *L);
void swap(List *l,int i,int j)
{
int temp = l->r[i];
l->r[i] = l->r[j];
l->r[j] = temp;
}
void print(List *l)
{
int i = 0;
for (i =0;ilength;i++)
{
printf("%d ",l->r[i]);
}
printf("%d ",l->r[i]);
printf("\n");
}
void MergeSort(List *L)
{
MSort(L->r,1,L->length);
}
void MSort(int arr[],int low,int high)
{
if(low >= high)
{
return;
}
int mid = low + (high - low)/2;
MSort(arr,low,mid);
MSort(arr,mid+1,high);
Merge(arr,low,mid,high);
}
void Merge(int arr[], int low,int mid,int high)
{
int i = low,j = mid+1,k=0;
int *temp = new int[high-low+1];
while(i <= mid&& j<=high)
{
if(arr[i] <= arr[j])
temp[k++] = arr[i++];
else
temp[k++] = arr[j++];
}
while(i<=mid)
{
temp[k++] = arr[i++];
}
while(j<=high)
{
temp[k++] = arr[j++];
}
for(i=low,k=0;i<=high;i++,k++)//将排好序的存回arr中low到high这区间
arr[i]=temp[k];
delete []temp;//释放内存,由于指向的是数组,必须用delete []
}
int main()
{
int d[9] = {80,10,20,90,30,60,70,40,50};
List l1;
int i =0 ;
for (i=0;i<9;i++)
{
l1.r[i+1] = d[i];
}
l1.length=9;
print(&l1);
MergeSort(&l1);
print(&l1);
}