《啊哈,算法》读书笔记

最快速、最简单的排序-- 桶排序:

     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();    

 

  

 

posted @ 2021-12-28 13:13  ZachRobin  阅读(59)  评论(0编辑  收藏  举报