交換類排序-----氣泡排序
阿新 • • 發佈:2018-12-17
氣泡排序:
//氣泡排序 # include<stdio.h>//時間複雜度 O(n^2) 穩定 void BubbleSort(int a[], int n){ for(int i = 1; i <= n; i++) //每一趟結束都把一個最大的數放到最下面 for(int j = 1; j <= n-i; j++) if(a[j] > a[j+1]){ int t = a[j]; a[j] = a[j+1]; a[j+1] = t; } } int main(){ int n; printf("請輸入你要排序的數的個數:"); scanf("%d", &n); int *a = new int[n];//申請一個整型變數空間,沒有賦初值,並定義一個整型指標a指向該地址空間 for(int i = 1; i <= n; i++) scanf("%d", &a[i]); BubbleSort(a, n); printf("排序後:"); for(int j = 1; j <= n; j++) printf("%6d", a[j]); delete []a;//回收陣列a的空間 return 0; }
氣泡排序改進1:
//氣泡排序--改進1新增標誌位,如果某一次排序中出現沒有交換位置,說明排序完成 # include<stdio.h> void BubbleSort(int a[], int n){ int flag = 0; //初始化表示沒有交換 for(int i = 1; i <= n; i++){ //每一趟結束都把一個最大的數放到最下面 flag = 0; for(int j = 1; j <= n-i; j++) if(a[j] > a[j+1]){ int t = a[j]; a[j] = a[j+1]; a[j+1] = t; flag = 1; //表示已經交換過了 } if(flag == 0) break;//一趟冒泡完成以後,若flag=0,則已經有序 ,跳出迴圈 } } int main(){ int n; printf("請輸入你要排序的數的個數:"); scanf("%d", &n); int *a = new int[n];//申請一個整型變數空間,沒有賦初值,並定義一個整型指標a指向該地址空間 for(int i = 1; i <= n; i++) scanf("%d", &a[i]); BubbleSort(a, n); printf("排序後:"); for(int j = 1; j <= n; j++) printf("%6d", a[j]); delete []a;//回收陣列a的空間 return 0; }
氣泡排序改進2:
/*氣泡排序--改進2,新增標誌位,記錄最後一次交換位置的地方,證明最後一次 交換位置後的地方是排好序的,下一次只需要排最後一次之前的地方就好*/ # include<stdio.h> void BubbleSort(int a[], int n){ int flag = n-1; //剛開始,最後交換位置的地方設定為陣列的最後一位 while(flag > 1){ //flag在逐漸減小,到最後肯定會變為1 int pos = 1; //每一輪的最開始,標誌位置在陣列1 for(int i = 1; i <= flag; i++)//第一趟要比n-1次 if(a[i] > a[i+1]){ int t = a[i]; a[i] = a[i+1]; a[i+1] = t; pos = i; //pos記錄最後一次交換位置的地方,pos往後的數都是有序的 } flag = pos;//因為氣泡排序是每次把最大的數沉到最底部,當下一趟排序遇到之前標記的位置pos時就可以不用再冒泡了 } } int main(){ int n; printf("請輸入你要排序的數的個數:"); scanf("%d", &n); int *a = new int[n];//申請一個整型變數空間,沒有賦初值,並定義一個整型指標a指向該地址空間 for(int i = 1; i <= n; i++) scanf("%d", &a[i]); BubbleSort(a, n); printf("排序後:"); for(int j = 1; j <= n; j++) printf("%6d", a[j]); delete []a;//回收陣列a的空間 return 0; }