1、算法描述:
冒泡排序(Bubble Sort) ,是一種計(jì)算機(jī)科學(xué)領(lǐng)域的較簡(jiǎn)單的排序算法。
它重復(fù)地走訪過要排序的數(shù)列,一次比較兩個(gè)元素,如果他們的順序錯(cuò)誤就把他們交換過來。走訪數(shù)列的工作是重復(fù)地進(jìn)行直到?jīng)]有再需要交換,也就是說該數(shù)列已經(jīng)排序完成。
這個(gè)算法的名字由來是因?yàn)樵酱蟮脑貢?huì)經(jīng)由交換慢慢“浮”到數(shù)列的頂端,故名冒泡排序(Bubble Sort)。
2、解答思路:
冒泡排序算法的運(yùn)作如下:(從后往前)
- 比較相鄰的元素。如果第一個(gè)比第二個(gè)大,就交換他們兩個(gè)。
- 對(duì)每一對(duì)相鄰元素作同樣的工作,從開始第一對(duì)到結(jié)尾的最后一對(duì)。在這一點(diǎn),最后的元素應(yīng)該會(huì)是最大的數(shù)。
- 針對(duì)所有的元素重復(fù)以上的步驟,除了最后一個(gè)。
- 持續(xù)每次對(duì)越來越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對(duì)數(shù)字需要比較。
3、實(shí)現(xiàn):
Swift版
class BubbleSort {
func sort(array : [Int]) -> [Int]? {
let index = array.count - 1
if index < 0 {
return nil
}
var copyArray = array
for out in 0...index {
for inner in 0..<(index-out) { // 從前往后遍歷
if copyArray[inner] < copyArray[inner + 1] {
var temp = copyArray[inner]
copyArray[inner] = copyArray[inner + 1]
copyArray[inner + 1] = temp
}
}
}
// for out in 0...index {
// var inner = index
//
// while inner>out { //從后往前遍歷
// if copyArray[inner] > copyArray[inner - 1] {
// let temp = copyArray[inner]
// copyArray[inner] = copyArray[inner - 1]
// copyArray[inner - 1] = temp
// }
// inner -= 1
// }
// }
return copyArray
}
}
let test = BubbleSort()
var array = [Int](repeating: 0, count: 20)
for index in 0..<20 {
array[index] = Int(arc4random_uniform(20)) + Int(arc4random_uniform(20)) + 1
}
test.sort(array : array)
C語言
void bubbleSort(int array[], int n) {
if (n<0) {
return;
}
int temp = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n - i -1; j++) {
if (array[j] < array[j+1]) {
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
}
4、分析:
1)、時(shí)間復(fù)雜度:
時(shí)間復(fù)雜度是講算法最壞情況下需要運(yùn)行的次數(shù)。
關(guān)鍵字比較次數(shù)C 和記錄移動(dòng)次數(shù)M 。
當(dāng)原數(shù)據(jù)完全逆序時(shí),需要進(jìn)行 n-1 趟排序。每趟排序要進(jìn)行 n - i 次關(guān)鍵字的比較(1≤i≤n-1),且每次比較都必須移動(dòng)記錄三次來達(dá)到交換記錄位置。在這種情況下,比較和移動(dòng)次數(shù)均達(dá)到最大值:
所以算法時(shí)間復(fù)雜度為:
2)、空間復(fù)雜度:
此算法需要的額外空間為一個(gè)temp元素的空間,當(dāng)然對(duì)于整型數(shù)據(jù),連這個(gè)temp都可以省略:
int a,b;
a = a + b
b = a - b
a = a - b
即可達(dá)到交換的目的。
所以空間復(fù)雜度為:O(1)。
3)、算法穩(wěn)定性:
冒泡排序就是把小的元素往前調(diào)或者把大的元素往后調(diào)。比較是相鄰的兩個(gè)元素比較,交換也發(fā)生在這兩個(gè)元素之間。如果兩個(gè)元素相等,是可以不用交換的;如果兩個(gè)相等的元素沒有相鄰,那么即使通過前面的兩兩交換讓兩個(gè)元素相鄰起來,這時(shí)候也不會(huì)交換,所以相同元素的前后順序并沒有改變,所以冒泡排序是一種穩(wěn)定排序算法。