三种排序算法


  从小到大排序

  • 桶排序 - 时间复杂度为Ο(M+N),快,但空间复杂度高
     1 #include
     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 }
  • 冒泡排序 - 时间复杂度为Ο(N2)
     1 #include
     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 }
  • 快速排序 - 最差时间复杂度为Ο(N2),平均时间复杂度为Θ(N㏒N),最常用
     1 #include
     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 }

相关