冒泡排序的方法,就是對於N個排序元素,比較相鄰的元素的大小,如果反序就交換位置,直到沒有反序的情況為止。
例如:給定數組{9,1,5,8,3,7,4,6, 2}
排列在數組的方式為:下面的數字為數組中的位置。這里我們假設要排列成從小到大。
9 |
1 |
5 |
8 |
3 |
7 |
4 |
6 |
2 |
0 1 2 3 4 5 6 7 8
第一次循環,求0位置的數值。從【8】位置,開始進行兩兩比較大小,並交換位置,把最小的數移動到左邊,如下圖:
其中每次交換的結果如下:對於第一個位置【0】,我們需要兩兩比較N-1次(8)。
對於位置【1】處,我們需要比較N-2次(7),對於第二個位置的數值的計算過程和上面類似。
上面的過程不斷的重復,直到確定到第【7】個位置的數值。排列第【0】個位置到【7】個位置的中間結果如下:
這樣,對於一個N的數組,我們需要比較1+2+….+N-1次,和為N(N-1)/2,所以計算的復雜度為O(N^2). 程序如下:
#include <iostream> struct MyArray { int value[9]; int length; }; void MySwap(MyArray* list, int i, int j) { int temp = list->value[i]; list->value[i] = list->value[j]; list->value[j] = temp; } void printArray(MyArray* list) { for(int i=0;i< list->length;++i) { std::cout << list->value[i]<<" "; } std::cout << std::endl; } void MyBubbleSort(MyArray* list) { int length = list->length; for(int i=0;i<= length-2; ++i) { for(int j= length-1; j>=i+1; --j) { if(list->value[j]<list->value[j-1]){ MySwap(list,j,j-1); } //printArray(list); } //std::cout << std::endl; //getchar(); printArray(list); } } void main() { MyArray A; A.length = 9; int X[9] = {9,1,5,8,3,7,4,6,2}; for(int i=0; i<9;++i) { A.value[i] = X[i]; } printArray(&A); std::cout << std::endl; MyBubbleSort(&A); //printArray(&A); }