题目来源: 《深入浅出程序设计竞赛--基础篇》------汪楚奇 P131 - 例9.2
解法1:选择排序
图1 选自《深入浅出程序设计竞赛--基础篇》
#include<iostream>
using namespace std;
#define maxn 100010
int a[maxn],n;
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
//选择排序
for (int i = 0; i < n - 1; i++)
{
for (int j = i + 1; j < n; j++)
{
if (a[j] < a[i])
{
int p = a[i];
a[i] = a[j];
a[j] = p;
}
}
}
for (int i = 0; i < n; i++)
{
cout << a[i]<<' ';
}
return 0;
}
解法2 冒泡排序
图2 选自《深入浅出程序设计竞赛--基础篇》
#include<iostream>
#define maxn 100000010
long long a[maxn];
int N;
using namespace std;
int main()
{
cin >> N;
for (int i = 0; i < N; i++)
{
cin >> a[i];
}
//冒泡排序
for (int i = 0; i < N -1; i++)
{
for (int j = 0; j < N - i - 1; j++)
{
if (a[j] > a[j + 1])
{
int p = a[j];
a[j] = a[j + 1];
a[j + 1] = p;
}
}
}
for (int i = 0; i < N; i++)
{
cout << a[i] << ' ';
}
cout << endl;
return 0;
}
解法3 插入排序
图3 选自《深入浅出程序设计竞赛--基础篇》
#include<iostream>
#define maxn 100000010
long long a[maxn];
int N;
using namespace std;
int main() {
cin >> N;
for (int i = 0; i < N; i++) {
cin >> a[i];
}
// 插入排序
for (int i = 1; i < N; i++) {
long long now = a[i]; // 记录待插入元素
int j = i - 1;
while (j >= 0 && a[j] > now) {
a[j + 1] = a[j];
j--;
}
a[j + 1] = now; // 插入元素
}
// 输出排序后的结果
for (int i = 0; i < N; i++) {
cout << a[i] << ' ';
}
cout << endl;
return 0;
}
前面三种解法的时间复杂都是O(n^2),当排序的数字较多时,并不是最佳的选择,在这道题中,只能通过一个测试点。下面说下比较优的排序算法----快速排序。
解法4 快速排序
图4 选自《深入浅出程序设计竞赛--基础篇》
#include<iostream>
#define maxn 100000010 // 定义最大数组长度
long long a[maxn]; // 使用静态数组存储数据
int N; // 存储输入的数字个数
using namespace std;
// 快速排序函数
void qsort(long long a[], long long l, long long r) {
long long i = l, j = r, flag = a[(l + r) / 2], temp; // 初始化左右指针和哨兵
do {
while (a[i] < flag) i++; // 从左边开始,找到第一个大于等于哨兵的元素
while (a[j] > flag) j--; // 从右边开始,找到第一个小于等于哨兵的元素
if (i <= j) { // 如果这两个元素的索引没有相交
temp = a[i]; // 交换这两个元素
a[i] = a[j];
a[j] = temp;
i++; // 移动指针,继续在未处理的部分进行同样的操作
j--;
}
} while (i <= j); // 当左指针超过右指针时,循环结束
if (l < j) qsort(a, l, j); // 递归处理左边的子序列
if (i < r) qsort(a, i, r); // 递归处理右边的子序列
}
int main() {
cin >> N; // 读取数字个数
for (int i = 0; i < N; i++) {
cin >> a[i]; // 读取每个数字
}
// 调用快速排序函数
qsort(a, 0, N - 1);
// 输出排序后的结果
for (int i = 0; i < N; i++) {
cout << a[i] << ' '; // 每个数字后面跟一个空格
}
cout << endl; // 在所有数字输出后换行
return 0;
}