给定N个(长整型范围内的)整数,要求输出从小到大排序后的结果。
本题旨在测试各种不同的排序算法在各种数据情况下的表现。各组测试数据特点如下:
数据1:只有1个元素;
数据2:11个不相同的整数,测试基本正确性;
数据3:10^3个随机整数;
数据4:10^4个随机整数;
数据5:10^5个随机整数;
数据6:10^5个顺序整数;
数据7:10^5个逆序整数;
数据8:10^5个基本有序的整数;
数据9:10^5个随机正整数,每个数字不超过1000。
输入格式:
输入第一行给出正整数N(≤10^5),随后一行给出N个(长整型范围内的)整数,其间以空格分隔。
输出格式:
本题旨在测试各种不同的排序算法在各种数据情况下的表现。各组测试数据特点如下:
数据1:只有1个元素;
数据2:11个不相同的整数,测试基本正确性;
数据3:10^3个随机整数;
数据4:10^4个随机整数;
数据5:10^5个随机整数;
数据6:10^5个顺序整数;
数据7:10^5个逆序整数;
数据8:10^5个基本有序的整数;
数据9:10^5个随机正整数,每个数字不超过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>
#define N 100000
#define Cutoff 10
#define Radix 10
void percdown(long *a, int n, int i);
void merge(long *a, long *tmp, int start, int end, int middle);
void msort(long *a, long *tmp, int start, int end);
void merge_pass(long *a, long *tmp, int n, int length);
void q_sort(long *a, int left, int right);
void bubble_sort(long *a, int n);
void insertion_sort(long *a, int n);
void selection_sort(long *a, int n);
void shell_sort(long *a, int n);
void shellsedgewick_sort(long *a, int n);
void heap_sort(long *a, int n);
void merge1_sort(long *a, int n);
void merge2_sort(long *a, int n);
void quick_sort(long *a, int n);
void radix_sort(long *a, int n);
int main() {
int i, n;
long a[N];
scanf("%d", &n);
for (i = 0;i < n;i++)
scanf("%ld", &a[i]);
radix_sort(a, n);
printf("%ld", a[0]);
for (i = 1;i < n;i++)
printf(" %ld", a[i]);
return 0;
}
//冒泡排序
void bubble_sort(long *a, int n) {
int i, j, flag;
long temp;
for (i = n - 1;i > 0;i--) {
flag = 0;
for (j = 0;j < i;j++) {
if (a[j] > a[j + 1]) {
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
flag = 1;
}
}
if (!flag) break;
}
}
//插入排序
void insertion_sort(long *a, int n) {
int i, j;
long temp;
for (i = 1;i < n;i++) {
temp = a[i];
for (j = i; j > 0 && a[j - 1] > temp; j--)
a[j] = a[j - 1];
a[j] = temp;
}
}
//选择排序
void selection_sort(long *a, int n) {
int i, j, t;
long temp;
for (i = 0;i < n - 1;i++) {
temp = a[i];
t = i;
for (j = i + 1;j < n;j++) {
if (a[j] < temp) {
temp = a[j];
t = j;
}
}
a[t] = a[i];
a[i] = temp;
}
}
//希尔排序-希尔增量
void shell_sort(long *a, int n) {
int i, j, d;
long temp;
for (d = n / 2;d > 0;d /= 2) {
for (i = d;i < n;i++) {
temp = a[i];
for (j = i;j >= d && a[j - d] > temp;j -= d)
a[j] = a[j - d];
a[j] = temp;
}
}
}
//希尔排序-sedgewick增量
void shellsedgewick_sort(long *a, int n) {
int i, j, d, si;
int Sedgewick[] = { 929, 505, 209, 109, 41, 19, 5, 1, 0 };
long temp;
for (si = 0;Sedgewick[si] >= n;si++)
;
for (;Sedgewick[si] > 0;si++) {
d = Sedgewick[si];
for (i = d;i < n;i++) {
temp = a[i];
for (j = i;j >= d && a[j - d] > temp;j -= d)
a[j] = a[j - d];
a[j] = temp;
}
}
}
//堆排序
void heap_sort(long *a, int n) {
int i;
long temp;
for (i = (n - 2) / 2; i >= 0; i--)
percdown(a, n, i);
for (i = n - 1;i > 0;i--) {
temp = a[i];
a[i] = a[0];
a[0] = temp;
percdown(a, i, 0);
}
}
void percdown(long *a, int n, int i) {
int child;
long x = a[i];
for (;i * 2 + 1 <= n - 1;i = child) {
child = i * 2 + 1;
if (child < n - 1 && a[child + 1] > a[child])
child++;
if (x >= a[child]) break;
else a[i] = a[child];
}
a[i] = x;
}
//归并排序-递归实现
void merge1_sort(long *a, int n) {
long *tmp = (long*)malloc(n*sizeof(long));
msort(a, tmp, 0, n - 1);
free(tmp);
}
void msort(long *a, long *tmp, int start, int end) {
int middle;
if (start < end) {
middle = (start + end) / 2;
msort(a, tmp, start, middle);
msort(a, tmp, middle + 1, end);
merge(a, tmp, start, end, middle);
}
}
void merge(long *a, long *tmp, int start, int end, int middle) {
int l, r, s;
s = start;
l = start;
r = middle + 1;
while (l <= middle && r <= end) {
if (a[l] <= a[r]) tmp[s++] = a[l++];
else tmp[s++] = a[r++];
}
while (l <= middle) tmp[s++] = a[l++];
while (r <= end) tmp[s++] = a[r++];
for (;start <= end;start++)
a[start] = tmp[start];
}
//归并排序-循环实现
void merge2_sort(long *a, int n) {
int length = 1;
long *tmp = (long*)malloc(n*sizeof(long));
while (length < n) {
merge_pass(a, tmp, n, length);
length *= 2;
merge_pass(tmp, a, n, length);
length *= 2;
}
free(tmp);
}
void merge_pass(long *a, long *tmp, int n, int length) {
int i, j;
for (i = 0;i + 2 * length <= n;i += 2*length)
merge(a, tmp, i, i + 2 * length - 1, i + length - 1);
if (i + length <= n)
merge(a, tmp, i, n - 1, i + length - 1);
else
for (j = i;j < n;j++)
tmp[j] = a[j];
}
//快速排序
void quick_sort(long *a, int n) {
q_sort(a, 0, n - 1);
}
void q_sort(long *a, int left, int right) {
long pivot, temp;
int i, j, center;
if (right - left + 1 > Cutoff) {
center = (left + right) / 2;
if (a[center] < a[left]) {
temp = a[center];a[center] = a[left];a[left] = temp;
}
if (a[right] < a[left]) {
temp = a[right];a[right] = a[left];a[left] = temp;
}
if (a[right] < a[center]) {
temp = a[right];a[right] = a[center];a[center] = temp;
}
temp = a[right - 1];a[right - 1] = a[center];a[center] = temp;
pivot = a[right - 1];
i = left;
j = right - 1;
for (;;) {
while (a[++i] < pivot);
while (a[--j] > pivot);
if (i < j) {
temp = a[i];a[i] = a[j];a[j] = temp;
}
else break;
}
temp = a[i];a[i] = a[right - 1];a[right - 1] = temp;
q_sort(a, left, i - 1);
q_sort(a, i + 1, right);
}
else
insertion_sort(a + left, right - left + 1);
}
//基数排序-次位优先
struct Node {
int data;
Node* next;
};
struct Bucket {
Node *head, *tail;
};
void radix_sort(long *a, int n) {
int d, di, i, flag;
long t;
Bucket b[Radix*2 - 1];//19个桶 -9--1,0,1-9;
Node *tmp, *p, *list = NULL;
for (i = 0;i <= (Radix-1) * 2;i++)
b[i].head = b[i].tail = NULL;
for (i = n - 1;i >= 0;i--) {
tmp = (Node*)malloc(sizeof(Node));
tmp->data = a[i];
tmp->next = list;
list = tmp;
}
for (d = 1;;d++) {
p = list;
flag = 0;
while (p) {
t = p->data;
for (i = 1;i <= d;i++) {
di = t % Radix;t /= Radix;
}
if (di != 0) flag = 1;
di += Radix-1;
tmp = p;
p = p->next;
tmp->next = NULL;
if (!b[di].head)
b[di].head = b[di].tail = tmp;
else {
b[di].tail->next = tmp;
b[di].tail = tmp;
}
}
if (!flag) break;
else {
list = NULL;
for (i = (Radix - 1) * 2;i >= 0;i--) {
if (b[i].head) {
b[i].tail->next = list;
list = b[i].head;
b[i].head = b[i].tail = NULL;
}
}
}
}
for (i = 0;i < n;i++) {
a[i] = b[Radix - 1].head->data;
b[Radix - 1].head = b[Radix - 1].head->next;
}
}
测试结果如下 |
1冒泡排序
测试点1 | 答案正确 | 1/1 | 1 | 1 |
测试点2 | 答案正确 | 10/10 | 1 | 1 |
测试点3 | 答案正确 | 2/2 | 3 | 1 |
测试点4 | 答案正确 | 2/2 | 260 | 1 |
测试点5 | 运行超时 | 0/2 | 0 | 0 |
测试点6 | 答案正确 | 2/2 | 39 | 2 |
测试点7 | 运行超时 | 0/2 | 0 | 0 |
测试点8 | 答案正确 | 2/2 | 668 | 2 |
测试点9 | 运行超时 | 0/2 | 0 | 0 |
2插入排序
测试点 | 结果 | 得分/满分 | 用时(ms) | 内存(MB) |
---|---|---|---|---|
测试点1 | 答案正确 | 1/1 | 2 | 1 |
测试点2 | 答案正确 | 10/10 | 1 | 1 |
测试点3 | 答案正确 | 2/2 | 2 | 1 |
测试点4 | 答案正确 | 2/2 | 24 | 1 |
测试点5 | 答案正确 | 2/2 | 3719 | 2 |
测试点6 | 答案正确 | 2/2 | 38 | 2 |
测试点7 | 答案正确 | 2/2 | 7592 | 2 |
测试点8 | 答案正确 | 2/2 | 55 | 2 |
测试点9 | 答案正确 | 2/2 | 3649 | 2 |
3选择排序
试点1 | 答案正确 | 1/1 | 2 | 1 |
测试点2 | 答案正确 | 10/10 | 2 | 1 |
测试点3 | 答案正确 | 2/2 | 3 | 1 |
测试点4 | 答案正确 | 2/2 | 59 | 1 |
测试点5 | 答案正确 | 2/2 | 9151 | 2 |
测试点6 | 答案正确 | 2/2 | 8199 | 2 |
测试点7 | 答案正确 | 2/2 | 8539 | 2 |
测试点8 | 答案正确 | 2/2 | 9357 | 2 |
测试点9 | 答案正确 | 2/2 | 9145 | 2 |
4 希尔排序
希尔增量
测试点1 | 答案正确 | 1/1 | 4 | 1 |
测试点2 | 答案正确 | 10/10 | 1 | 1 |
测试点3 | 答案正确 | 2/2 | 2 | 1 |
测试点4 | 答案正确 | 2/2 | 7 | 1 |
测试点5 | 答案正确 | 2/2 | 57 | 2 |
测试点6 | 答案正确 | 2/2 | 44 | 2 |
测试点7 | 答案正确 | 2/2 | 44 | 2 |
测试点8 | 答案正确 | 2/2 | 42 | 2 |
测试点9 | 答案正确 | 2/2 | 51 | 2 |
sedgewick增量
测试点1 | 答案正确 | 1/1 | 1 | 1 |
测试点2 | 答案正确 | 10/10 | 12 | 1 |
测试点3 | 答案正确 | 2/2 | 2 | 1 |
测试点4 | 答案正确 | 2/2 | 6 | 1 |
测试点5 | 答案正确 | 2/2 | 62 | 2 |
测试点6 | 答案正确 | 2/2 | 41 | 2 |
测试点7 | 答案正确 | 2/2 | 52 | 2 |
测试点8 | 答案正确 | 2/2 | 40 | 2 |
测试点9 | 答案正确 | 2/2 | 51 | 2 |
5堆排序
测试点1 | 答案正确 | 1/1 | 1 | 1 |
测试点2 | 答案正确 | 10/10 | 2 | 1 |
测试点3 | 答案正确 | 2/2 | 3 | 1 |
测试点4 | 答案正确 | 2/2 | 6 | 1 |
测试点5 | 答案正确 | 2/2 | 54 | 2 |
测试点6 | 答案正确 | 2/2 | 47 | 2 |
测试点7 | 答案正确 | 2/2 | 48 | 2 |
测试点8 | 答案正确 | 2/2 | 47 | 2 |
测试点9 | 答案正确 | 2/2 | 50 | 2 |
6归并排序
测试点1 | 答案正确 | 1/1 | 1 | 1 |
测试点2 | 答案正确 | 10/10 | 1 | 1 |
测试点3 | 答案正确 | 2/2 | 2 | 1 |
测试点4 | 答案正确 | 2/2 | 6 | 1 |
测试点5 | 答案正确 | 2/2 | 53 | 2 |
测试点6 | 答案正确 | 2/2 | 45 | 2 |
测试点7 | 答案正确 | 2/2 | 56 | 2 |
测试点8 | 答案正确 | 2/2 | 44 | 2 |
测试点9 | 答案正确 | 2/2 | 49 | 2 |
7快速排序
测试点1 | 答案正确 | 1/1 | 2 | 1 |
测试点2 | 答案正确 | 10/10 | 2 | 1 |
测试点3 | 答案正确 | 2/2 | 2 | 1 |
测试点4 | 答案正确 | 2/2 | 6 | 1 |
测试点5 | 答案正确 | 2/2 | 47 | 2 |
测试点6 | 答案正确 | 2/2 | 40 | 2 |
测试点7 | 答案正确 | 2/2 | 43 | 2 |
测试点8 | 答案正确 | 2/2 | 41 | 2 |
测试点9 | 答案正确 | 2/2 | 44 | 2 |
8 基数排序
测试点1 | 答案正确 | 1/1 | 14 | 1 |
测试点2 | 答案正确 | 10/10 | 2 | 1 |
测试点3 | 答案正确 | 2/2 | 4 | 1 |
测试点4 | 答案正确 | 2/2 | 16 | 1 |
测试点5 | 答案正确 | 2/2 | 80 | 5 |
测试点6 | 答案正确 | 2/2 | 57 | 5 |
测试点7 | 答案正确 | 2/2 | 63 | 5 |
测试点8 | 答案正确 | 2/2 | 55 | 5 |
测试点9 | 答案正确 | 2/2 | 86 | 5 |
9 qsort
#include<stdib.h>
测试点1 | 答案正确 | 1/1 | 1 | 1 |
测试点2 | 答案正确 | 10/10 | 1 | 1 |
测试点3 | 答案正确 | 2/2 | 3 | 1 |
测试点4 | 答案正确 | 2/2 | 6 | 1 |
测试点5 | 答案正确 | 2/2 | 57 | 2 |
测试点6 | 答案正确 | 2/2 | 44 | 2 |
测试点7 | 答案正确 | 2/2 | 46 | 2 |
测试点8 | 答案正确 | 2/2 | 44 | 2 |
测试点9 | 答案正确 | 2/2 | 51 | 2 |
10 sort
#include <algorithm>
测试点1 | 答案正确 | 1/1 | 2 | 1 |
测试点2 | 答案正确 | 10/10 | 2 | 1 |
测试点3 | 答案正确 | 2/2 | 3 | 1 |
测试点4 | 答案正确 | 2/2 | 6 | 1 |
测试点5 | 答案正确 | 2/2 | 47 | 2 |
测试点6 | 答案正确 | 2/2 | 43 | 2 |
测试点7 | 答案正确 | 2/2 | 49 | 2 |
测试点8 | 答案正确 | 2/2 | 44 | 2 |
测试点9 | 答案正确 | 2/2 | 42 | 2 |