《啊哈,算法》读书笔记
最快速、最简单的排序-- 桶排序:
int a[11], i, j, t; //开辟存储空间为11 的数组 for (i = 0; i <= 10; i++) { a[i] = 0;//初始化存储内容 } for (i = 1; i <= 5; i++) {//循环读入5个数 scanf("%d", &t);//把每个数读到变量 t 中 a[t]++;//进行计数 } for (i = 10; i >= 0; i--) {//依次判断 a[0] ~ a[10] for (j = 1; j <= a[i]; j++) {//出现了几次就打印几次 printf("%d", i); } } getchar(); getchar();//用来暂停程序,方便查看输出内容,也可用 system("pause") 代替 // system("pause");
时间复杂度:
第2行循环了 m 次(m 为桶的个数),第6行循环了 n 次(n 为待排序的个数),用O表示时间复杂度,则公共循环了 (m+n) 次,记作 O(m+n)
缺点:非常浪费空间,每次都需要开辟很多,例如,排序 200000以内的,需要申请 200000 个变量
冒泡排序:
冒泡排序的基本思想是:每次比较两个相邻的元素,如果它们的顺序错误就把它们交换 过来。
int a[100], i, j, t, n; scanf("%d", &n);//输入一个数 n 表示接下来有 n 个数 for (i = 1; i <= n; i++) {//循环读入 n 个数 到 数组 a 中 scanf("%d", &a[i]); } for (i = 1; i <= n-1; i++) {//n 个数排序,只用进行 n-1 次 for (j = 1; j <= n - i; j++) {//从第1位开始比较,直到最后一个尚未归位的数, /* 降序 if (a[j] < a[j+1]) {//比较大小并交换 t = a[j]; a[j] = a[j+1]; a[j+1] = t; } */ if (a[j] > a[j+1]) {//升序 t = a[j]; a[j] = a[j+1]; a[j+1] = t; } } } for (i = 1; i <= n; i++) { printf("%d", a[i]); } getchar(); getchar();