7-1 归并排序,快排
给定n个数进行排序。
输入格式:
第一行一个数n(n<=1000000)。
第二行n个随机的数(每个数绝对值<=108)。
输出格式:
排好序的n个数(升序)。
输入样例:
5
1 3 9 7 8
输出样例:
1 3 7 8 9
代码长度限制
16 KB
时间限制
200 ms
内存限制
64 MB
#include <stdio.h>
#include <stdlib.h>
int a[1000001]={0}, n;
int min(int x, int y) {
return x < y ? x : y;
}
void merge_sort(int arr[], int len) {
int *a = arr;
int *b = (int *) malloc(len * sizeof(int));
int seg, start;
for (seg = 1; seg < len; seg += seg) {
for (start = 0; start < len; start += seg * 2) {
int low = start, mid = min(start + seg, len), high = min(start + seg * 2, len);
int k = low;
int start1 = low, end1 = mid;
int start2 = mid, end2 = high;
while (start1 < end1 && start2 < end2)
b[k++] = a[start1] < a[start2] ? a[start1++] : a[start2++];
while (start1 < end1)
b[k++] = a[start1++];
while (start2 < end2)
b[k++] = a[start2++];
}
int *temp = a;
a = b;
b = temp;
}
if (a != arr) {
int i;
for (i = 0; i < len; i++)
b[i] = a[i];
b = a;
}
free(b);
}
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &a[i]);
merge_sort(a, n);
for (int i = 0; i < n; i++)
printf("%d ", a[i]);
// system("pause");
return 0;
}