氣泡排序演算法分析

2022-09-07 18:18:13 字數 2001 閱讀 9946

氣泡排序的基本思想:

對於待排序數列, 依次比較相鄰元素, 若順序相反, 則交換位置, 重複此步驟直至完成排序.

[5, 4, 3, 2, 1]來演示整個排序過程

原始序列:    5, 4, 3, 2, 1

第一趟排序: 4, 5, 3, 2, 1

4, 3, 5, 2, 1

4, 3, 2, 5, 1

4, 3, 2, 1, 5

第二趟排序: 3, 4, 2, 1, 5

3, 2, 4, 1, 5

3, 2, 1, 4, 5

第三趟排序: 2, 3, 1, 4, 5

2, 1, 3, 4, 5

第四趟排序: 1, 2, 3, 4, 5

可以看出:

每一趟排序都將所經過的最大的元素放在了最後的位置, 所以第 n趟排序並不需要關心倒數第 n + 1個元素.

// 氣泡排序

private

static

int bubblesort(int arr)

}break;

}return arr;

}/*

output:

原始陣列: [5, 4, 3, 2, 1]

i = 0, j = 1 ---> [4, 5, 3, 2, 1]

i = 1, j = 2 ---> [4, 3, 5, 2, 1]

i = 2, j = 3 ---> [4, 3, 2, 5, 1]

i = 3, j = 4 ---> [4, 3, 2, 1, 5]

i = 0, j = 1 ---> [3, 4, 2, 1, 5]

i = 1, j = 2 ---> [3, 2, 4, 1, 5]

i = 2, j = 3 ---> [3, 2, 1, 4, 5]

i = 0, j = 1 ---> [2, 3, 1, 4, 5]

i = 1, j = 2 ---> [2, 1, 3, 4, 5]

i = 0, j = 1 ---> [1, 2, 3, 4, 5]

排序後: [1, 2, 3, 4, 5]

*/// 交換陣列中指定索引處的元素位置

private

static

void

swap(int arr, int i, int j)

int tmp = arr[i];

arr[i] = arr[j];

arr[j] = tmp;

}// 列印陣列元素

private

static

void

printarr(int arr)

// 列印 i, j的索引, 和當前陣列的順序

private

static

void

printarr(int i, int j, int arr)

假設: 給定乙個含有 n個元素的序列

最好情形:

給定序列是正序, 那麼走一趟即可完成排序, 所需比較次數c和記錄移動次數m均達到最小值, 即:

cmin = n - 1

mmin = 0

所以, 氣泡排序最好的時間複雜度是 o(n)

最壞情形:

給定序列是倒序, 那麼需要進行n - 1趟排序, 第i趟排序需要進行n - i次比較, 且每次比較都必須移動記錄三次來達到交換位置的效果, 在這種情況下, 比較和移動次數均達到最大值.

所以, 氣泡排序最壞的時間複雜度是 o(n^2)

cmax = n * (n - 1) / 2 = o(n^2)

mmax = 3 * n * (n - 1) / 2 = o(n^2)

綜上所述, 氣泡排序的平均時間複雜度是 o(n^2)

排序演算法分析 氣泡排序

假設有n個元素,現在要把這些元素按照從小到大的順序進行排序,那麼演算法步驟如下,從第0個元素開始,比較相鄰的兩個元素,第0個和第1個,第1個和第2個,第n 2個和第n 1個,比較範圍是 0,n 1 所有元素都參與比較 如果左邊的比右邊的大,就交換他們的位置,一直比較到最後乙個元素。這樣經過第一輪交換...

氣泡排序的演算法分析

include include include pragma warning disable 4996 void bubble sort int array,int num 傳入陣列元素 int main 定義乙個int型陣列 int i bubble sort array,7 呼叫氣泡排序 for...

雙向氣泡排序 和 單向氣泡排序 演算法分析比較

假設單向氣泡排序也是 在如果沒有交換發生的情況下則終止 即changeflag false的情況下 以下是單向氣泡排序 1 最差情況 假設輸入打下為n 1 單向排序 需要進行n次外迴圈,n次changeflag false 賦值和後面的比較判斷,即2 n。每次外迴圈有n i 1次內迴圈,內迴圈總數為...