0 Offer(新的一天新的难过
1. 快速排序
思想:分治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/*
快速排序
思想:分治
时间复杂度:最坏O(n^2), 一般O(nlogn)
*/
using namespace std;
const int maxn = 1e6+100;
int a[maxn],n, b[maxn];
void quick_sort(int l, int r)
{
if(l>=r) return;
int first=l, last=r, key=a[first];
while(first<last)
{
while(first<last && a[last]>=key){
--last;
}
a[first]=a[last];
while(first<last && a[first]<=key){
++first;
}
a[last]=a[first];
}
a[first]=key;
quick_sort(l, first-1);
quick_sort(first+1, r);
}
int main()
{
scanf("%d", &n);
for(int i=1;i<=n;i++) scanf("%d", &a[i]);
quick_sort(1, n);
for(int i=1;i<=n;i++) printf("%d ", a[i]);
return 0;
}
2. 归并排序
思想:分治的思想。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/*
归并排序
思想:分治
时间复杂度:O(nlogn)
*/
using namespace std;
const int maxn = 1e6+100;
int a[maxn],n, b[maxn];
void merge_sort(int l, int r)
{
if(l==r) return;
int mid=(l+r)/2;
merge_sort(l, mid);
merge_sort(mid+1, r);
int st=l, ed=mid+1;
int cnt=l-1;
while(st<=mid && ed<=r){
if(a[st]<=a[ed]){
b[++cnt]=a[st];
++st;
}
else{
b[++cnt]=a[ed];
++ed;
}
}
while(st<=mid){ b[++cnt]=a[st]; ++st; }
while(ed<=r){ b[++cnt]=a[ed]; ++ed;}
for(int i=l;i<=r;i++) a[i]=b[i];
}
int main()
{
scanf("%d", &n);
for(int i=1;i<=n;i++) scanf("%d", &a[i]);
merge_sort(1, n);
for(int i=1;i<=n;i++) printf("%d ", a[i]);
return 0;
}
3. 堆排序
思想:1
2
4. 基数排序
思想:1
2
5. 桶排序
思想:1
2
6. 冒泡排序
思想: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/*
冒泡排序
思想:每次当次的 max 放到最后
时间复杂度:O(n^2)
*/
using namespace std;
const int maxn = 1e6+100;
int a[maxn],n;
void mo()
{
for(int i=1;i<=n;i++){
for(int j=1;j<=n-i;j++)
{
if(a[j]>a[j+1]){
swap(a[j], a[j+1]);
}
}
}
}
int main()
{
scanf("%d", &n);
for(int i=1;i<=n;i++){
scanf("%d", &a[i]);
}
mo();
for(int i=1;i<=n;i++)
printf("%d ", a[i]);
return 0;
}
7. 选择排序
思想:不断找 min 从前往后放即可。
1 | /* |
8. 插入排序
思想:不断找 min 从前往后放即可。
1 | /* |
9. 希尔排序
思想:
1 | ``` |