氣泡排序的基本思想:
對於待排序數列, 依次比較相鄰元素, 若順序相反, 則交換位置, 重複此步驟直至完成排序.
以[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次內迴圈,內迴圈總數為...