小甲魚 排序演算法 氣泡排序
阿新 • • 發佈:2018-11-11
小甲魚 排序演算法 氣泡排序
氣泡排序
基本思想:兩兩相鄰記錄的關鍵字,如果反序則交換,直到沒有反序的記錄為止
(PS 反序:大在前,小在後)
下面的程式碼不是真正意義的氣泡排序(因為比較的不是相鄰)
//BubbleSort氣泡排序 #include <stdio.h> void BubbleSort(int k[], int n) { int i, j, temp; //為什麼n-1,因為排序到最後一個,最後一個已經是最大的,不需要再排序 for (i = 0; i < n-1; i++) { //j=i+1:下一個元素 for (j = i+1; j < n; j++) { //從小到大排序 if (k[i] > k[j]) { temp = k[j]; k[j] = k[i]; k[i] = temp; } } } } int main(void) { int i, a[10] = {5, 2, 6, 0, 3, 9, 1, 7, 4, 8}; BubbleSort(a, 10); printf("排序後的結果是:"); for (i = 0; i < 10; i++) { printf("%d", a[i]); } printf("\n\n"); return 0; }
氣泡排序的要點
1、兩兩注意是相鄰的兩個元素的意思。
2、如果有n個元素需要比較n-1次,每一輪減少1次比較。
3、既然叫氣泡排序,那就是從下往上兩兩比較,所以看上去就跟泡泡往上冒一樣。
真正意義的冒泡演算法
陣列從最後面進行比較,每一次排序確定最小的排在前面
//BubbleSort氣泡排序 #include <stdio.h> void BubbleSort(int k[], int n) { int i, j, temp, count1=0, count2=0; for (i = 0; i < n-1; i++) { //為什麼是n-1? //每一次迴圈後確定的元素不在參與比較 //第一次確定第一大,第二次確定第二大 for (j = n-1; j > i; j--) { count1++; //從小到大排序 if (k[j-1] > k[j]) { count2++; temp = k[j-1]; k[j-1] = k[j]; k[j] = temp; } } } printf("總共進行了%d次比較,進行了%d次移動!\n", count1, count2); } int main(void) { int i, a[10] = {5, 2, 6, 0, 3, 9, 1, 7, 4, 8}; BubbleSort(a, 10); printf("排序後的結果是:"); for (i = 0; i < 10; i++) { printf("%d", a[i]); } printf("\n\n"); return 0; }
優化氣泡排序演算法
//BubbleSort氣泡排序 #include <stdio.h> void BubbleSort(int k[], int n) { int i, j, temp, count1=0, count2=0, flag; flag = 1; for (i = 0; i < n-1 && flag; i++) { //為什麼是n-1? //每一次迴圈後確定的元素不在參與比較 //第一次確定第一大,第二次確定第二大 for (j = n-1; j > i; j--) { count1++; flag = 0;//沒有執行移動 //從小到大排序 if (k[j-1] > k[j]) { count2++; temp = k[j-1]; k[j-1] = k[j]; k[j] = temp; flag = 1; } } } printf("總共進行了%d次比較,進行了%d次移動!\n", count1, count2); } int main(void) { int i, a[10] = {5, 2, 6, 0, 3, 9, 1, 7, 4, 8}; BubbleSort(a, 10); printf("排序後的結果是:"); for (i = 0; i < 10; i++) { printf("%d", a[i]); } printf("\n\n"); return 0; }