1. 程式人生 > 其它 >演算法筆記 - 排序

演算法筆記 - 排序

  • 桶排序- 空間複雜度高
 1 //桶排序
 2 
 3 #include<stdio.h>
 4 
 5 int main() {
 6     int book[1001], i, j, n, t;
 7     for(i = 0; i <= 1000; i++)
 8         book[i] = 0;
 9     scanf("%d", &n); //輸入一個數n,表示接下來有n個數
10     for(i = 1; i <= n; i++) { //迴圈讀入n個數,並進行桶排序
11         scanf("%d", &t); //把每一個數讀到變數t中
12 book[t]++; //進行計數,對編號為t的桶放一個小旗子 13 } 14 for(i = 1000; i >= 1; i--) //依次判斷編號1000~0的桶 15 for(j = 1; j <= book[i]; j++) //出現了幾次就將桶的編號列印幾次 16 printf("%d ", i); 17 return 0; 18 }
  • 氣泡排序 - 時間複雜度為Ο(N2)
 1 //氣泡排序 從大到小排序
 2 
 3 //書上給的
 4 #include<stdio.h>
 5 
 6 int main() {
7 int a[100], i, j, t, n; 8 scanf("%d", &n); //輸入一個數,表示接下來有n個數 9 for(i = 1; i <= n; i++) //迴圈讀入n個數到陣列a中 10 scanf("%d", &a[i]); 11 //氣泡排序的核心部分 12 for(i = 1; i <= n-1; i++) { //n個數排序,只用進行n-1趟 13 for(j = 1; j <= n-i; j++) { //從第一位開始比較到最後一個尚未歸位的數 14 if
(a[j] < a[j+1]) { //比較大小並交換 15 t = a[j]; 16 a[j] = a[j+1]; 17 a[j+1] = t; 18 } 19 } 20 } 21 for(i = 1; i <= n; i++) //輸出結果 22 printf("%d ", a[i]); 23 return 0; 24 } 25 26 /* 我的嘗試 27 #include<stdio.h> 28 29 int main() { 30 int n, i, j, t; 31 scanf("%d", &n); 32 int arr[n+1]; 33 for(i = 1; i <= n; i++) 34 scanf("%d", &arr[i]); 35 for(i = n; i >= 1; i--) { 36 for(j = 2; j <= i; j++) 37 if(arr[j] > arr[j-1]) { 38 t = arr[j]; 39 arr[j] = arr[j-1]; 40 arr[j-1] = t; 41 } 42 } 43 for(i = 1; i <= n; i++) 44 printf("%d ", arr[i]); 45 return 0; 46 } 47 */
  • 三、快速排序 - 最差時間複雜度為Ο(N2),平均時間複雜度為Θ(N㏒N)
 1 #include<stdio.h>
 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 
35 int main() {
36     int i, j, t;
37     //讀入資料
38     scanf("%d", &n);
39     for(i = 1; i <= n; i++)
40         scanf("%d", &a[i]);
41 
42     quicksort(1, n); //快速排序呼叫
43 
44     //輸出排序後的結果
45     for(i = 1; i <= n; i++)
46         printf("%d ", a[i]);
47 
48     return 0;
49 }