0%

排序算法

快速排序,O($nlogn$)

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
#include <cstdio>
#include <algorithm>
using namespace std;

const int N = 1e5 + 10;
int vals[N], n;

void quick_sort(int l, int r)
{
if(l >= r) return;
int i = l - 1, j = r + 1, mid = vals[i + j >> 1];
while(i < j)
{
do ++i; while(vals[i] < mid);
do --j; while(vals[j] > mid);
if(i < j) swap(vals[i], vals[j]);
}
quick_sort(l, j), quick_sort(j + 1, r);
}

int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
scanf("%d", &vals[i]);
quick_sort(1, n);
for(int i = 1; i <= n; ++i)
printf("%d ", vals[i]);
return 0;
}

快速选择算法,O(n)

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
#include <cstdio>
#include <algorithm>
using namespace std;

const int N = 1e5 + 10;
int vals[N];

int quick_select(int l, int r, int k)
{
if(l == r) return vals[l];
int i = l - 1, j = r + 1, mid = vals[i + j >> 1];
while(i < j)
{
do ++i; while(vals[i] < mid);
do --j; while(vals[j] > mid);
if(i < j) swap(vals[i], vals[j]);
}
int len = j - l + 1;
if(len >= k) return quick_select(l, j, k);
return quick_select(j + 1, r, k - len);
}

int main()
{
int n, k;
scanf("%d%d", &n, &k);
for(int i = 1; i <= n; ++i)
scanf("%d", &vals[i]);
printf("%d", quick_select(1, n, k));
return 0;
}

归并排序,O($nlogn$),需要额外O(n)的空间

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
#include <cstdio>
using namespace std;

const int N = 1e5 + 10;
int vals[N], temp[N];

void merge_sort(int l, int r)
{
if(l >= r) return;
int i = l, mid = l + r >> 1, j = mid + 1, k = 1;
merge_sort(l, mid), merge_sort(j, r);
while(i <= mid && j <= r)
{
if(vals[i] <= vals[j]) temp[k++] = vals[i++];
else temp[k++] = vals[j++];
}
while(i <= mid) temp[k++] = vals[i++];
while(j <= r) temp[k++] = vals[j++];
for(int i = l, k = 1; i <= r; ++i, ++k)
vals[i] = temp[k];
}

int main()
{
int n;
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
scanf("%d", &vals[i]);
merge_sort(1, n);
for(int i = 1; i <= n; ++i)
printf("%d ", vals[i]);
return 0;
}