排序算法(Sorting algorithm)是一种将一组特定的数据按某种顺序进行排列的算法。排序算法多种多样,性质也大多不同。
几种排序算法的比较:
题目描述
利用快速排序算法将读入的 N 个数从小到大排序后输出。
输入格式
第 1 行为一个正整数 N,第 2 行包含 N 个空格隔开的正整数 ai ,为你需要进行排序的数,数据保证了 ai 不超过 109 。
输出格式
将给定的 N 个数从小到大输出,数之间空格隔开,行末换行且无空格。
输入输出样例
输入 #1
输出 #1
说明/提示
对于 20% 的数据,有 N≤103 ;
对于 100% 的数据,有 N≤105 。
快速排序
快速排序(Quicksort),又称分区交换排序(partition-exchange sort),简称快排,是一种被广泛运用的排序算法。
解决方案
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| #include <iostream> #include <cstdio> using namespace std; const int maxn = 100500; int n; int a[maxn]; void quick_sort(int a_[], int l, int r) { int mid = a_[(l + r) >> 1]; int i = l; int j = r; do { while (a_[i] < mid) i++; while (a_[j] > mid) j--; if (i <= j) { swap(a_[i], a_[j]); i++; j--; } } while (i <= j); if (l < j) quick_sort(a_, l, j); if (r > i) quick_sort(a_, i, r); } int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); } quick_sort(a, 1, n); for (int i = 1; i <= n; i++) { printf("%d ", a[i]); } return 0; }
|
归并排序
归并排序(merge sort)是一种采用了 分治 思想的排序算法。
解决方案
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| #include <iostream> #include <cstdio> using namespace std; const int maxn = 100500; int n; int a[maxn]; void merge_sort(int a_[], int l, int r) { int mid = (l + r) >> 1; int len = r - l + 1; if (l < mid) merge_sort(a_, l, mid); if (r > mid + 1) merge_sort(a_, mid + 1, r); int tmp[len]; int i = l, j = mid + 1, k = 0; while (i <= mid && j <= r) tmp[k++] = a_[i] < a_[j] ? a_[i++] : a_[j++]; while (i <= mid) tmp[k++] = a_[i++]; while (j <= r) tmp[k++] = a_[j++]; for (i = 0; i < len; i++) { a_[l + i] = tmp[i]; } }
int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); } merge_sort(a, 1, n); for (int i = 1; i <= n; i++) { printf("%d ", a[i]); } return 0; }
|
例题
请参阅