冒泡排序的方法,就是对于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); }