归并排序:
1、将数组内容递归分割为两个子序列,直至序列只含一个元素
2、将子序列元素递归合并,直至只有一个有序序列
分割序列函数:
void merge_sort(int *arr,int start,int end)
{
if(start == end) //判断子序列元素个数是否为 1,若为 1 则无需继续分割
return;
//arr[start] = arr[end];//此句代替return亦可
else
{
int mid = (start + end) / 2; //获取中间位置下标
merge_sort(arr,0,mid); //分割产生的左子序列
merge_sort(arr,mid + 1,end); //分割产生的右子序列
merge(arr,start,mid,end); //合并
}
}
合并序列函数:
void merge(int *arr,int start,int mid,int end)
{ //遍历左子序列
for(int i = start;i <= mid;i++)
{
//遍历右子序列
for(int j = mid + 1;j <= end;j++)
{ //判断左子序列和右子序列元素大小
if(arr[i] > arr[j])
{
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
}
完整程序:
#include <stdio.h>
#include <windows.h>
//函数声明:
void merge_sort(int *arr,int start,int end);
void merge(int *arr,int start,int mid,int end);
void show(int *arr,int length);
void main()
{
int arr[] = {8,7,6,5,4,3,2,1};
int length = sizeof(arr) / sizeof(arr[0]);
merge_sort(arr,0,length - 1);
show(arr,length);
system("pause");
return ;
}
//分割序列
void merge_sort(int *arr,int start,int end)
{
if(start == end) //判断子序列元素个数是否为 1,若为 1 则无需继续分割
return;
//arr[start] = arr[end];//此句代替return亦可
else
{
int mid = (start + end) / 2; //获取中间位置下标
merge_sort(arr,0,mid); //分割产生的左子序列
merge_sort(arr,mid + 1,end); //分割产生的右子序列
merge(arr,start,mid,end); //合并
}
}
//合并序列
void merge(int *arr,int start,int mid,int end)
{ //遍历左子序列
for(int i = start;i <= mid;i++)
{
//遍历右子序列
for(int j = mid + 1;j <= end;j++)
{ //判断左子序列和右子序列元素大小
if(arr[i] > arr[j])
{
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
}
//输出序列元素
void show(int *arr,int length)
{
printf("排序后数组元素为:\n");
for(int i = 0;i < length;i++)
{
printf("%d\t",arr[i]);
}
printf("\n");
}
测试结果:
结果图示:
声明:此文章为学习笔记,如有侵权请联系删除。