氣泡排序的C、C++實現
阿新 • • 發佈:2018-11-08
一、氣泡排序
氣泡排序就是重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果他們的順序(如數字從大到小、首字母從A到Z)錯誤就把他們交換過來。走訪元素的工作是重複地進行直到沒有相鄰元素需要交換,也就是說該元素已經排序完成。
這個演算法的名字由來是因為越大的元素會經由交換慢慢“浮”到數列的頂端(升序或降序排列),就如同碳酸飲料中二氧化碳的氣泡最終會上浮到頂端一樣,故名“氣泡排序”。
氣泡排序演算法的原理如下:
- 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
- 對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
- 針對所有的元素重複以上的步驟,除了最後一個。
- 持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
二、排序過程
如需要排序的元素為 88,1,59,105,9,2,8,15,6,10
,將需要排序的元素按照從小到大依次排序,接下來一步一步分析使用氣泡排序對這些元素進行排序的過程。
- 排序前: 88 1 59
105
9 2 8 15 6 10 - 經過第一輪排序 1 59
88
9 2 8 15 6 10 105 - 經過第二輪排序 1
59
9 2 8 15 6 10 88 105 - 經過第三輪排序 1 9 2 8
15
6 10 59 88 105 - 經過第四輪排序 1 2 8
9
6 10 15 59 88 105 - 經過第五輪排序 1 2 8 6 9 10 15 59 88 105
- 經過第六輪排序 1 2 8 6 9 10 15 59 88 105
以上就是氣泡排序的整個排序過程,經過六輪排序之後所有排序已經完成。
三、程式實現
1、不設定元素位置交換標誌位。
#include<iostream> using namespace std; const int BUFFSIZE = 10; int Bubble_Sort(int Arr[]); int main() { int Arr[BUFFSIZE] = { 88,1,59,105,9,2,8,15,6,10 }; // 待排序元素 Bubble_Sort(Arr) //排序 return 0; } int Bubble_Sort(int Arr[]) { int Counts = BUFFSIZE - 1; // 排序總輪數 for (int i = 0; i < Counts; i++) { for (int j = 0; j < Counts - i; j++) { if (Arr[j] > Arr[j + 1]) { int tmp = Arr[j + 1]; Arr[j + 1] = Arr[j]; Arr[j] = tmp; } } //每一輪排序後輸出元素順序 for (int i = 0; i < BUFFSIZE; i++) { cout << Arr[i] << " "; } cout << endl; } return 0; }
程式輸出:
1 59 88 9 2 8 15 6 10 105
1 59 9 2 8 15 6 10 88 105
1 9 2 8 15 6 10 59 88 105
1 2 8 9 6 10 15 59 88 105
1 2 8 6 9 10 15 59 88 105
1 2 6 8 9 10 15 59 88 105 // 在第六次的時候已經排序完成
1 2 6 8 9 10 15 59 88 105
1 2 6 8 9 10 15 59 88 105
1 2 6 8 9 10 15 59 88 105
由程式輸出可以看出,在第六次的時候已經排序完成,後面幾次都沒有元素交換,也就是說後面幾次其實是無意義的。這樣我們可以改進一下排序演算法,設定一個元素位置交換標誌位記錄本次排序是否有元素位置發生變化,如果沒有則認為排序已經完成,程式不需要再繼續執行,改進後的程式如下。
2、改進排序演算法,設定元素位置交換標誌位。
#include<iostream>
using namespace std;
const int BUFFSIZE = 10;
int Bubble_Sort_r(int Arr[]);
int main()
{
int Arr2[BUFFSIZE] = { 88,1,59,105,9,2,8,15,6,10 }; // 待排序元素
Bubble_Sort_r(Arr2); // 排序
return 0;
}
int Bubble_Sort_r( int Arr[])
{
bool SwapFlag = true; // 標誌位,記錄每次排序是否有元素位置交換
int Counts = BUFFSIZE - 1;
for (int i = 0; i < Counts&&SwapFlag!=false; i++) // 如果上次排序元素位置未改變,則排序完成。
{
SwapFlag = false; // 每次排序前,標誌位復位
for (int j = 0; j < Counts - i; j++)
{
if (Arr[j] > Arr[j + 1])
{
SwapFlag = true; //發生位置交換,標誌位置位
int tmp = Arr[j + 1];
Arr[j + 1] = Arr[j];
Arr[j] = tmp;
}
}
for (int i = 0; i < BUFFSIZE; i++)
{
cout << Arr[i] << " ";
}
cout << endl;
}
return 0;
}
程式輸出:
1 59 88 9 2 8 15 6 10 105
1 59 9 2 8 15 6 10 88 105
1 9 2 8 15 6 10 59 88 105
1 2 8 9 6 10 15 59 88 105
1 2 8 6 9 10 15 59 88 105
1 2 6 8 9 10 15 59 88 105 // 在第六次的時候已經排序完成
1 2 6 8 9 10 15 59 88 105 // 第七次標誌位沒有置位,發現排序已經完成