1. 程式人生 > >排序演算法(四)氣泡排序及其優化

排序演算法(四)氣泡排序及其優化

基本思路:
氣泡排序的基本思路是通過元素的兩兩比較不斷將較大值(升序)或則較小值(降序)移動序列的後面,類似於氣泡向上冒的排序演算法。

​ 1、比較相鄰兩個元素大小,如若不符合要求則交換元素;
​ 2、對整個序列做同樣1的操作,最後的元素一定是當前比較的序列中最大(或最小)的元素;
​ 3、重複以上操作除了上一次遍歷的最後一個元素。
圖解(升序):
這裡寫圖片描述

我們可以根據氣泡排序原理寫出程式碼:
void BubbleSort(int arr[], int len)//升序
{
    int i = 0;
    int j = 0;
    for (i = 0; i < len; i++)
    {
        for
(j =i+1; j <len ; j++) { if (arr[i] > arr[j]) { swap(arr[i], arr[j]); } } }

但是,如圖所示,第七趟排完已經是有序,但是上面的程式碼,還會多走幾趟,為了提高效率,我們可以優化以上程式碼,用一個標誌位來標識某一趟是否有交換資料,如果某一趟沒有一個數據進行交換,做說明已經有序,可以直接停止。

如下給出優化後的程式碼:

void BubbleSort(int arr[], int
len)//升序 { int i = 0; int j = 0; int flag = 1;// for (i = 0; i < len && flag; i++) { flag = 0; //假設有序,經過一趟比較後若有序,則flag值不變,下趟可直接結束迴圈 for (j = i + 1; j <len; j++) { if (arr[i] > arr[j]) { flag = 1; //若發生交換,則改變flag的值
swap(arr[i], arr[j]); } } } }

測試程式碼如下:

int main()
{
    int arr[] = { 0,9,1,4,7,5,3,6,2,8 };
    int len = sizeof(arr) / sizeof(arr[0]);
    BubbleSort(arr, len);
    for (int i = 0; i < len; i++)
    {
        cout << arr[i] << "  ";
    }
    cout << endl;
    system("pause");
    return 0;
}