注意:允许转载,但转载请注明作者和出处
最重要:复习归并排序和快速排序
归并排序
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N], tmp[N];
int n;
void merge(int a[], int l, int r)
{
if (l >= r) return;
int mid = l + r >> 1;
merge(a, l, mid);
merge(a, mid + 1, r);
int i = l, j = mid + 1;
int k = 0;
while (i <= mid && j <= r)
{
if (a[i] < a[j]) tmp[k ++] = a[i ++];
else tmp[k ++] = a[j ++];
}
while (i <= mid) tmp[k ++] = a[i ++];
while (j <= r) tmp[k ++] = a[j ++];
for (int i = l, j = 0; i <= r; i ++, j ++)
a[i] = tmp[j];
}
int main()
{
cin >> n;
for (int i = 0; i < n; i ++) cin >> a[i];
merge(a, 0, n - 1);
for (int i = 0; i < n; i ++) cout << a[i] << ' ';
puts("");
return 0;
}
快速排序
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int n;
void quick_sort(int a[], int l, int r)
{
if (l >= r) return;
int x = a[l + r >> 1];
int i = l - 1, j = r + 1;
while (i < j)
{
do i ++; while(a[i] < x);
do j --; while(a[j] > x);
if (i < j) swap(a[i], a[j]);
}
quick_sort(a, l, j);
quick_sort(a, j + 1, r);
}
int main()
{
cin >> n;
for (int i = 0; i < n; i ++) cin >> a[i];
quick_sort(a, 0, n - 1);
for (int i = 0; i < n; i ++) cout << a[i] << ' ';
puts("");
return 0;
}
AcWing 1579. 插入还是归并
题目
答案
2024年冗杂版
// 个人感觉这个答案好理解一些。。。。
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 110;
int a[N], b[N];
int n;
bool check(int a[], int b[])
{
for (int i = 0; i < n; i ++)
if (a[i] != b[i]) return false;
return true;
}
int main()
{
cin >> n;
for (int i = 0; i < n; i ++) cin >> a[i];
for (int i = 0; i < n; i ++) cin >> b[i];
int p = 1;
while (p < n && b[p] >= b[p - 1]) p ++;
int k = p;
while (k < n && a[k] == b[k]) k ++;
// cout << k << endl;
if (k == n)
{
puts("Insertion Sort");
while (p && b[p - 1] > b[p])
{
swap(b[p - 1], b[p]);
p --;
}
for (int i = 0; i < n; i ++) cout << b[i] << ' ';
puts("");
}
else
{
puts("Merge Sort");
int step = 1;
while (true)
{
int len = 1 << step;
for (int i = 0; i < n; i += len)
{
int j = min(i + len, n);
sort(a + i, a + j);
}
// for (int i = 0; i < n; i ++) cout << a[i] << ' ';
// puts("");
if (check(a, b)) break;
step ++;
}
step ++;
int len = 1 << step;
for (int i = 0; i < n; i += len)
{
int j = min(i + len, n);
sort(a + i, a + j);
}
for (int i = 0; i < n; i ++) cout << a[i] << ' ';
puts("");
}
return 0;
}
2022年 简易版
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 110;
int a[N], b[N];
int n;
bool check()
{
for (int i = 0; i < n; i ++)
if (a[i] != b[i]) return false;
return true;
}
int main()
{
cin >> n;
for (int i = 0; i < n; i ++) cin >> a[i];
for (int i = 0; i < n; i ++) cin >> b[i];
int k = 0;
while (b[k + 1] >= b[k]) k ++;
bool match = true;
for (int i = k + 1; i < n; i ++)
{
if (a[i] != b[i])
{
match = false;
break;
}
}
if (match) // 如果是插入排序
{
puts("Insertion Sort");
sort(b, b + k + 2);
for (int i = 0; i < n; i ++) cout << b[i] << ' ';
puts("");
}
else // 如果是归并排序,按步长为1,2,4,8,16这样判断,归并排序特点是是步长内有序
{
puts("Merge Sort");
int step = 1;
while (true)
{
bool match = check(); // a和b匹配了吗?不管匹不匹配,都得继续往下步长内排序
int len = 1 << step; // 左移k位,相当于 1 * 2^k
for (int i = 0; i < n; i += len) // 步长内排序
{
int j = min(i + len, n);
sort (a + i, a + j);
}
if (match) break;
step ++;
}
for (int i = 0; i < n; i ++) cout << a[i] << ' ';
}
return 0;
}