算法思想
二路归并排序算法,其主要思想是采用递归的方法将一个“大问题”分解为若干个相似的“小问题”,进而求解。
执行方法
用户根据需要输入长度,程序动态创建数组,然后根据提示用户输入待排序列,程序进行排序并输出结果。
代码
#include<stdio.h>
#include<stdlib.h>
void merge(int *arr,int low,int mid,int high)
{
//合并两个有序子序列
int i,k;
int* temp = (int*)malloc((high-low+1)*sizeof(int));//开辟临时数组空间
int start1 = low;
int end1 = mid;
int start2 = mid+1;
int end2 = high;
//比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
for (k = 0;start1<=end1 && start2<=end2;k++)
{
if (arr[start1]<arr[start2])
temp[k] = arr[start1++];
else
temp[k] = arr[start2++];
}
//检测剩余项,若有剩余,直接复制到合并序列尾
while (start1<=end1)
temp[k++] = arr[start1++];
while (start2<=end2)
temp[k++] = arr[start2++];
//将排好序的数组复制回原数组
for (i = 0;i<high-low+1;i++)
arr[low+i] = temp[i];
free(temp);
}
void mergesort(int arr[],int low,int high)
{
int mid;
if(low != high)
{
mid = (low + high) / 2;
mergesort(arr,low,mid);
mergesort(arr,mid + 1,high);
merge(arr,low,mid,high);
}
}
void main()
{
int size,i;
printf("请输入要创建的数组长度:\n");
scanf("%d",&size);
int *arr = (int*)malloc(size*sizeof(int));
//根据需求动态创建数组
for(i = 0;i < size;i++)
{
printf("请输入数组的第%d个元素:\n",i+1);
scanf("%d",&arr[i]);
}
//for循环传入数组元素
printf("数组创建成功!\n");
for(i = 0;i < size;i++)
{
printf("%d\t",arr[i]);
}
//创建成功发出提示,并列出当前数组中的元素
printf("\n");
int low = 0;
//设置数组左端标志,置零
int high = size-1;
//设置数组右端标志,由于数组从0开始,置长度减一,否则会发生溢出
mergesort(arr,low,high);
printf("排序后数组如下:\n");
for(i = 0;i < size;i++)
{
printf("%d\t",arr[i]);
}
printf("\n");
//输出排序后的数组与之前的输出进行比较
}