氣泡排序及其優化

2021-08-28 17:46:36 字數 2021 閱讀 8519

**部分使用了utils類,定義在這篇文章中有說明。

核心**:

//c++實現

void

bubblesort

(int

* a,

int n)

for(

int i=n-

1; i>=

0; i--)}

}}

試想一下,如果待排序的序列是[1,2,3,4,5,6,7,9,8],也就是倒數第一和倒數第二個關鍵字需要交換,別的都已經是正常順序,當i=1時,交換了8和9,序列已經有序,但是演算法仍然將i=2~9以及每個迴圈中的j迴圈都執行一遍,雖然沒有交換資料,但這種大量的比較也是多餘的,優化的方法是當一趟冒泡中並沒有發生交換時,說明序列已經時有序的了,這時候便可以停止執行,所以改進**,增加乙個flag變數用來標記是否有交換的發生。c++實現如下:

void

bubblesort

(int

* a,

int n)

bool flag = true;

//定義標誌變數flag

for(

int i=n-

1; i>=

0&& flag; i--)}

}}

雞尾酒排序又叫定向氣泡排序,攪拌排序、來回排序等,是氣泡排序的一種變形。此演算法與氣泡排序的不同處在於排序時是以雙向在序列中進行排序。

雞尾酒排序在於排序過程是先從低到高,然後從高到低;而氣泡排序則僅從低到高去比較序列裡的每個元素。它可以得到比氣泡排序稍微好一點的效能,原因是氣泡排序只從乙個方向進行比對(由低到高),每次迴圈只移動乙個專案。

以序列(2,3,4,5,1)為例,雞尾酒排序只需要從低到高,然後從高到低就可以完成排序,但如果使用氣泡排序則需要四次。

但是在亂數序列的狀態下,雞尾酒排序與氣泡排序的效率都很差勁。

//c++實現

void

cocktailsort

(int

* a,

int n)

} right--

;for

(j=right; j>left; j--)}

left++;}

}

時間複雜度

在設定標誌變數之後:

當原始序列「正序」排列時,氣泡排序總的比較次數為n-1,移動次數為0,也就是說氣泡排序在最好情況下的時間複雜度為o(n);

當原始序列「逆序」排序時,氣泡排序總的比較次數為n(n-1)/2,移動次數為3n(n-1)/2次,所以氣泡排序在最壞情況下的時間複雜度為o(n^2);

當原始序列雜亂無序時,氣泡排序的平均時間複雜度為o(n^2)。

空間複雜度

氣泡排序排序過程中需要乙個臨時變數進行兩兩交換,所需要的額外空間為1,因此空間複雜度為o(1)。

穩定性氣泡排序在排序過程中,元素兩兩交換時,相同元素的前後順序並沒有改變,所以氣泡排序是一種穩定排序演算法。

#include

#include

"utils.h"

using namespace std;

class bubblesort

bool flag = true;

for(

int i=n-

1; i>=

0&& flag; i--)}

}}void

cocktailsort

(int

* a,

int n)

} right--

;for

(j=right; j>left; j--)}

left++;}

}};int

main

(int argc,

char

const

*argv)

氣泡排序及其優化

然則 2015年12月30日發布 氣泡排序是比較簡單的,其排序步驟就是比較相鄰元素並將較大的往後移。每掃瞄一輪,將確定乙個元素的位置。實現如下 void sort int a 對氣泡排序的優化主要是減少交換次數。如果一次掃瞄中元素沒有發生交換,那麼排序就可以結束了。為此可設定一標誌量flag,預設為...

氣泡排序及其優化

課程名稱 資料結構 實驗專案名稱 排序演算法的實現與比較 實驗目的 1 掌握優化氣泡排序的演算法 實驗要求 1 對於輸入的任意乙個整型資料序列,將其進行氣泡排序,要求該氣泡排序的演算法為優化之後的演算法,即 a.設定flag變數,當一趟排序結束後flag的值未更新,剛說明序列已經有序,停止排序 b....

氣泡排序及其優化

bubble sort比較簡單,本文首先列出了基礎版本bubble sort的偽 之後做兩點小的優化。1.基礎版本bubblesort 原始版的bubblesort 時間複雜度為o n 2 function bubblesort array x,int length for int i 0 i le...