给定N个(长整型范围内的)整数,要求输出从小到大排序后的结果。
本题旨在测试各种不同的排序算法在各种数据情况下的表现。各组测试数据特点如下:
数据1:只有1个元素;
数据2:11个不相同的整数,测试基本正确性;
数据3:103个随机整数;
数据4:104个随机整数;
数据5:105个随机整数;
数据6:105个顺序整数;
数据7:105个逆序整数;
数据8:105个基本有序的整数;
数据9:105个随机正整数,每个数字不超过1000。
输入格式:
输入第一行给出正整数N(≤10
5
),随后一行给出N个(长整型范围内的)整数,其间以空格分隔。
输出格式:
在一行中输出从小到大排序后的结果,数字间以1个空格分隔,行末不得有多余空格。
输入样例:
11
4 981 10 -17 0 -20 29 50 8 43 -5
输出样例:
-20 -17 -5 0 4 8 10 29 43 50 981
#include <stdio.h>
#include <stdlib.h>
void choose_sort(int * a, int n)
{
int i,j;
for (i=0; i<n; i++)
{
int min = a[i];
int minIndex = i;
for (j=i+1;j<n;j++)
{
if (a[j] < min)
{
min = a[j];
minIndex = j;
}
}
int temp = a[i];
a[i] = min;
a[minIndex] = temp;
}
}
void bubble_sort(int * a, int n)
{
int i,j;
for (i=n-1; i>=0; i--)
{
for (j=0;j<i;j++)
{
if (a[j] > a[j+1])
{
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
}
void insert_sort(int * a, int n)
{
int i, j;
for (i=1; i<n; i++)
{
if (a[i] < a[i-1]) // if >, there is no need to insert
{
for (j=0; j<=i; j++)
{
if (a[i] < a[j])
break;
}
int k;
int temp = a[i];
for (k=i; k>j; k--)
{
a[k] = a[k-1];
}
a[j] = temp;
}
}
}
void shell_sort(int * a, int n)
{
int step = n/2;
int i,j,k, num;
for (;step >= 1; step = step/2)
{
for (num=0; num<step; num++)
{
for (i=num+step; i<n; i=i+step)
{
if (a[i] < a[i-step]) // if >, there is no need to insert
{
for (j=num; j<=i; j=j+step)
{
if (a[i] < a[j])
break;
}
int temp = a[i];
for (k=i; k>j; k=k-step)
{
a[k] = a[k-step];
}
a[j] = temp;
}
}
}
}
}
void heap_sort(int * a, int n)
{
int i;
for (i=n-1; i>0; i--)
{
// build heap for a[1 to i]
// get last heap top
int j = (i-1)/2;
for (;j>=0; j--)
{
int temp = a[j];
int parent, child;
for (parent=j; parent*2+1<=i; parent=child)
{
child = parent * 2 + 1;
if ((child+1 <= i) && (a[child+1] > a[child]))
child++;
if (temp > a[child])
break;
else
a[parent] = a[child];
}
a[parent] = temp;
}
// swap a[0] & a[i]
int temp = a[0];
a[0] = a[i];
a[i] = temp;
}
}
int len;
void merge(int * a, int l, int r, int * temp)
{
int mid=(l+r)/2;
int i=l,j=mid+1,k=l;
while(i<=mid && j<=r)
{
if (a[i] < a[j])
temp[k++] = a[i++];
else
temp[k++] = a[j++];
}
while(i<=mid)
{
temp[k++] = a[i++];
}
while(j<=r)
{
temp[k++] = a[j++];
}
for (i=l;i<=r;i++)
{
a[i] = temp[i];
}
}
void merge_sort_helper(int * a, int l, int r, int * temp)
{
if (l == r)
return;
int mid = (l+r)/2;
merge_sort_helper(a, l, mid, temp);
merge_sort_helper(a, mid+1, r, temp);
merge(a, l, r, temp);
}
void merge_sort(int * a, int n)
{
len = n;
int * temp = (int *)malloc(sizeof(int)*n);
merge_sort_helper(a, 0, n-1, temp);
}
void getInput(int * a, int n)
{
int i;
for (i=0;i<n;i++)
{
scanf("%d", &a[i]);
}
}
int main(void)
{
// get input;
int n;
scanf("%d", &n);
int * a = (int *)malloc(sizeof(int)*n);
getInput(a, n);
// sort
merge_sort(a, n);
// print
int i;
for (i=0;i<n;i++)
{
printf("%d", a[i]);
if (i!=n-1)
printf(" ");
}
return 0;
}