氣泡排序就這麼簡單

2021-09-11 08:57:42 字數 3037 閱讀 2571

在我大一的時候自學c語言和資料結構,我當時就接觸到了氣泡排序(當時使用的是c語言編寫的)。現在大三了,想要在暑假找到乙份實習的工作,又要回顧一下資料結構與演算法的知識點了。

排序對我們來說是一點也不陌生了,當你打王者榮耀的時候也會有段位之分,當你打dota的時候也有天梯分。從高往下數,這個排名是有規律的,就是一種排序。

我最開始接觸的就是氣泡排序,所以這篇博文主要講的是氣泡排序。

氣泡排序(bubble sort,台灣譯為:泡沫排序或氣泡排序)是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越大的元素會經由交換慢慢「浮」到數列的頂端,故名。

演算法描述:

i從0開始,ii+1比較,如果i>i+1,那麼就互換i不斷增加,直到i

從最簡單開始,首先我們建立乙個陣列,該陣列有5位數字:

int arrays = ;

複製**

下面我們根據演算法的描述來進行**驗算**(第一趟排序)**:

//使用臨時變數,讓兩個數互換

int temp;

//第一位和第二位比

if (arrays[0] > arrays[1])

//第二位和第三位比

if (arrays[1] > arrays[2])

//第三位和第四位比

if (arrays[2] > arrays[3])

//第四位和第五位比

if (arrays[3] > arrays[4])

複製**

如果前一位的數比後一位的數要大,那麼就交換,直到將陣列的所有元素都比較了一遍!

經過我們第一趟比較,我們可以發現:最大的值就在陣列的末尾了!

第二趟排序跟第一趟排序一樣,也是用前一位與後一位比較,如果前一位比後一位要大,那就交換。值得注意的是:並不需要與最後一位比較了,因為在第一趟排序完了,最後一位已經是最大的數了。同理,我們第二趟排序完了之後,倒數第二位也是第二大的數了。

第二趟排序的**如下:

//第一位和第二位比

if (arrays[0] > arrays[1])

//第二位和第三位比

if (arrays[1] > arrays[2])

//第三位和第四位比

if (arrays[2] > arrays[3])

//第四位不需要和第五位比了,因為在第一趟排序結束後,第五位是最大的了。

複製**

結果:我們的第二大數已經排在了倒數第二位了

值得說明的是:上面的結果看起來已經是排序好的了,其實是我在測試時資料還不足夠亂,如果資料足夠亂的話,是需要4(n-1)趟排序的

但我們從上面的**就可以發現:第一趟和第二趟的比較、交換**都是重複的,並且我們的比較都是寫死的(0,1,2,3,4),並不通用

我們的陣列有5位數字

我們可以根據上面規律推斷出:

再從上面的規律可以總結出:5位數的陣列需要4躺排序的,每躺排序之後次數減1(因為前一趟已經把前一趟數的最大值確定下來了)!

於是我們可以根據for迴圈和變數將上面的**進行簡化

int temp;

//外層迴圈是排序的趟數

for (int i = 0; i < arrays.length - 1 ; i++) }}

複製**

從上面的例子我們可以看出來,如果資料足夠亂的情況下是需要經過4躺比較才能將陣列完整排好序。但是我們在第二躺比較後就已經得到排好序的陣列了。

但是,我們的程式在第二趟排序後仍會執行第三趟、第四趟排序。這是沒有必要的,因此我們可以對其進行優化一下:

**如下:

//裝載臨時變數

int temp;

//記錄是否發生了置換, 0 表示沒有發生置換、 1 表示發生了置換

int ischange;

//外層迴圈是排序的趟數

for (int i = 0; i < arrays.length - 1; i++)

}//如果比較完一趟沒有發生置換,那麼說明已經排好序了,不需要再執行下去了

if (ischange == 0)

}複製**

c語言實現第一種方式:

void

bubble

( int arr, int n)}}

void

bubblesort

( int arr, int n)

}複製**

c語言實現第二種方式遞迴:

void

bubble

( int arr, int l, int r)

bubble(arr, l, r - 1);//第一輪已排好r }}

複製**

測試**:

int

main();

bubblesort(arr, 8);

for (int i = 0; i < 9; i++)

cout

<< arr[i] << endl;

return

0; }

複製**

氣泡排序就這麼簡單

在我大一的時候自學c語言和資料結構,我當時就接觸到了氣泡排序 當時使用的是c語言編寫的 現在大三了,想要在暑假找到乙份實習的工作,又要回顧一下資料結構與演算法的知識點了。排序對我們來說是一點也不陌生了,當你打王者榮耀的時候也會有段位之分,當你打dota的時候也有天梯分。從高往下數,這個排名是有規律的...

氣泡排序就這麼簡單

在我大一的時候自學c語言和資料結構,我當時就接觸到了氣泡排序 當時使用的是c語言編寫的 現在大三了,想要在暑假找到乙份實習的工作,又要回顧一下資料結構與演算法的知識點了。排序對我們來說是一點也不陌生了,當你打王者榮耀的時候也會有段位之分,當你打dota的時候也有天梯分。從高往下數,這個排名是有規律的...

選擇排序就這麼簡單

選擇排序 selection sort 是一種簡單直觀的排序演算法。它的工作原理是每一次從待排序的資料元素中選出最小 或最大 的乙個元素,存放在序列的起始 末尾 位置,直到全部待排序的資料元素排完。選擇排序是不穩定的排序方法 比如序列 5,5,3 第一次就將第乙個 5 與 3 交換,導致第乙個5挪動...