排序--归并排序
原理:归并排序采用分治的思想,将一组数据进行二分,划分次数为nlgn(先分),再从最小区间开始逐级往上进行排序合并(再治),合并操作是一次遍历完成,所以时间复杂度是n,整个算法的时间复杂度为nlgn。此外,归并排序需要额外的空间存储,大小为n。
源代码:用户先录入设定大小个数的元素,元素在一行用空格分隔,然后进行排序,在一行输出结果,元素用空格分隔,可循环实现。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void merge_sort(int *array, int left, int mid,int right)
{
int *temp = (int*)malloc(sizeof(int)*(right - left + 1));
/* num用于存储temp数组的下标 */
int num = 0;
int left_start = left;
int right_start = mid + 1;
/* 对两个区间进行排序,归并入temp数组内 */
while(left_start <= mid && right_start <= right)
{
if(array[left_start] <= array[right_start])
{
temp[num] = array[left_start];
left_start++;
num++;
}
else
{
temp[num] = array[right_start];
right_start++;
num++;
}
}
/* 当需要合并的两区间个数不一致,将剩余数字直接插入数组 */
while(left_start <= mid)
{
temp[num++] = array[left_start++];
}
while(right_start <= right)
{
temp[num++] = array[right_start++];
}
/* 节省空间,将临时数组释放 */
num = 0;
while(left <= right)
{
array[left++] = temp[num++];
}
free(temp);
}
void split_merge_sort(int *array, int left, int right)
{
if(left >= right)
return;
int mid = (left + right)/2;
/* 先分再治 */
split_merge_sort(array, left, mid);
split_merge_sort(array, mid + 1, right);
merge_sort(array, left, mid, right);
}
int main()
{
while(1)
{
int num = 0;
int i = 0;
printf("请输入需要排序的数字的个数\n");
scanf("%d",&num);
printf("输入整数大小为:%d\n", num);
int array[num];
memset(array, 0, num);
if(i < num)
{
while(scanf("%d",&array[i++]))
{
if(getchar() == '\n')
break;
}
}
split_merge_sort(array, 0, i);
printf("归并排序后的结果为:");
for(int j = 0; j < num; j++)
{
printf("%d ", array[j]);
}
system("pause");
}
return 0;
}

浙公网安备 33010602011771号