三种排序算法
三种排序算法
从小到大排序
桶排序 - 时间复杂度为Ο(M+N),快,但空间复杂度高
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
161
2
3 int main() {
4 int book[1001], n, t;
5 for(int i = 1; i <= 1000; i++)
6 book[i] = 0;
7 scanf("%d", &n); //输入一个数n,表示接下来有n个数
8 for(int i = 1; i <= n; i++) { //循环读入n个数,并进行桶排序
9 scanf("%d", &t); //把每一个数读到变量t中
10 book[t]++; //进行计数,对编号为t的桶放一个小旗子
11 }
12 for(int i = 1; i <= 1000; i++) //依次判断编号1000~0的桶
13 for(int j = 1; j <= book[i]; j++) //出现了几次就将桶的编号打印几次
14 printf("%d ", i);
15 return 0;
16 }冒泡排序 - 时间复杂度为Ο(N^2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
211
2
3 int main() {
4 int a[100], t, n;
5 scanf("%d", &n); //输入一个数,表示接下来有n个数
6 for(int i = 1; i <= n; i++) //循环读入n个数到数组a中
7 scanf("%d", &a[i]);
8 //冒泡排序的核心部分
9 for(int i = 1; i <= n-1; i++) { //n个数排序,只用进行n-1趟
10 for(int j = 1; j <= n-i; j++) { //从第一位开始比较到最后一个尚未归位的数
11 if(a[j] > a[j+1]) { //比较大小并交换
12 t = a[j];
13 a[j] = a[j+1];
14 a[j+1] = t;
15 }
16 }
17 }
18 for(int i = 1; i <= n; i++) //输出结果
19 printf("%d ", a[i]);
20 return 0;
21 }快速排序 - 最差时间复杂度为Ο(N^2),平均时间复杂度为Θ(N㏒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
34
35
36
37
38
39
40
41
42
43
44
45
461
2 int a[101], n; //全局变量,这两个变量需要在子函数中使用
3
4 void quicksort(int left, int right) {
5 int i, j, t, temp;
6 if(left > right)
7 return;
8 temp = a[left]; //temp中存的就是基准数
9 i = left;
10 j = right;
11 while(i != j) {
12 //顺序很重要,要先从右往左找
13 while(a[j] >= temp && i < j)
14 j--;
15 //再从左往右找
16 while(a[i] <= temp && i < j)
17 i++;
18
19 //交换两个数在数组中的位置
20 if(i < j) { //当哨兵i和哨兵j没有相遇时
21 t = a[i];
22 a[i] = a[j];
23 a[j] = t;
24 }
25 }
26 //最终将基准数归位
27 a[left] = a[i];
28 a[i] = temp;
29
30 quicksort(left, i - 1); //递归,继续处理左边的
31 quicksort(i + 1, right); //递归,继续处理左边的
32 }
33
34 int main() {
35 scanf("%d", &n);
36 for(int i = 1; i <= n; i++)
37 scanf("%d", &a[i]);
38
39 quicksort(1, n); //快速排序调用
40
41 //输出排序后的结果
42 for(int i = 1; i <= n; i++)
43 printf("%d ", a[i]);
44
45 return 0;
46 }
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 怀民亦未寝。!