經典排序演算法 氣泡排序演算法及其優化(穩定)

2021-07-11 08:29:11 字數 2061 閱讀 8425

氣泡排序就是把小的元素往前調或者把大的元素往後調。比較是相鄰的兩個元素比較,交換也發生在這兩個元素之間。所以,如果兩個元素相等,我想你是不會再無聊地把他們倆交換一下的;如果兩個相等的元素沒有相鄰,那麼即使通過前面的兩兩交換把兩個相鄰起來,這時候也不會交換,所以相同元素的前後順序並沒有改變,所以氣泡排序是一種穩定排序演算法。

最好情況o(n),最壞情況o(n2),平均情況o(n2),輔助空間o(1)

設陣列長度為n。

比較相鄰的前後二個資料,如果前面資料大於後面的資料,就將二個資料交換。

這樣對陣列的第0個資料到n-1個資料進行一次遍歷後,最大的乙個資料就「沉」到陣列第n-1個位置。

n=n-1,如果n不為0就重複前面二步,否則排序完成。

按照定義:

#include#includevoid show(int *arr, int n)

void swap(int *a, int *b)

void bubblesort(int *arr, int n)

void main()

; show(arr, 10);

bubblesort(arr, 10);

show(arr, 10);

system("pause");

}

執行結果:

陣列排序:9  8  7  6  4  5  3  1  2  0

陣列排序:0 1 2 3 4 5 6 7 8 9

請按任意鍵繼續. . .

下面對其進行優化,設定乙個標誌,如果這一趟發生了交換,則為true,否則為false。明顯如果有一趟沒有發生交換,說明排序已經完成。

#include#includevoid show(int *arr, int n)

void swap(int *a, int *b)

void bubblesort2(int *arr, int n)

k--; }}

void main()

; show(arr, 10);

bubblesort2(arr, 10);

show(arr, 10);

system("pause");

}

執行結果:

陣列排序:9  8  7  6  4  5  3  1  2  0

陣列排序:0 1 2 3 4 5 6 7 8 9

請按任意鍵繼續. . .

void bubblesort2(int *arr, int n)

} if (!falg)

break;

}}

再做進一步的優化。如果有100個數的陣列,僅前面10個無序,後面90個都已排好序且都大於前面10個數字,那麼在第一趟遍歷後,最後發生交換的位置必定小於10,且這個位置之後的資料必定已經有序了,記錄下這位置,第二次只要從陣列頭部遍歷到這個位置就可以了。

#include#includevoid show(int *arr, int n)

void swap(int *a, int *b)

void bubblesort3(int *arr, int n) }}

void main()

; show(arr, 10);

bubblesort3(arr, 10);

show(arr, 10);

system("pause");

}

執行結果:

陣列排序:9  8  7  6  4  5  3  1  2  0

陣列排序:0 1 2 3 4 5 6 7 8 9

請按任意鍵繼續. . .

引自

經典排序演算法,氣泡排序

氣泡排序是本人在大一學習c語言的時候就已經學過了,最近這段時間想起來把比較經典的排序演算法拿來回顧一下,鞏固一下知識。氣泡排序的核心就是比較相鄰兩個數的大小,然後將小的 或者大的 放到前面去,經過一趟之後,就能把最小或者最大的放到最前面,第二趟排序的時候,第乙個數不參與排序,從第二個數開始,經過一趟...

經典排序演算法 氣泡排序

對列表的無序部分從頭至尾掃瞄一遍,掃瞄過程中通過不斷交換相鄰兩個元素,最終把最大 小 元素交換到列表末尾。首先比較第一和第二個數,把較大的放在第二位。比較第二個和第三個數,再把較大的數放在第三位。如此比較下去,直到比較完最後兩個數。這樣就把整個列表中最大的數交換到了末尾。上面三步只是完成了對列表無序...

經典排序演算法 氣泡排序

氣泡排序的原理是從第乙個數字開始,依次讓相鄰的兩個數字進行比較,按照從大到小或從小到大的順序進行交換 如果是公升序排列就把小的放前面,如果降序排列就把大的放前面 第一趟比較後,就把最大的的數字放在最後乙個位置 假設按照公升序排列 然後進行第二趟比較,依次進行相鄰數字比較,第二趟比較後次大的數字放在了...