冒泡排序属于交换排序的一种。
思想(升序为例)就是:
1.从数组的最后一个元素开始往前走,直到数组的第一个元素为止。
2.数组两两相邻元素之间进行比较,如果前一个比后一个大,则交换这两个元素的值。这样一趟下来,就会有一个最小值出现在数组的第一个元素位置。
3.然后再从数组的最后一个元素开始往前走,直到数组的第二个元素为止。数组两两相邻元素之间进行比较,如果前一个比后一个大,则交换这两个元素的值。这样一趟下来,就会有有一个第二小的值出现在数组的第二个元素位置。
4.这样重复步骤3.直到最大的元素出现在数组的第n个位置为止。
这样冒泡排序就排好了。
冒泡排序的性能分析:
最好的情况下:在如下代码中,i=0时,从j=n-1到j=i+1;比较了n-1次,发现数组已经有序,无序再排,直接返回。时间复杂度为O(n)。
一般情况下:冒泡排序的时间复杂度为O(n*n).
注意!
冒泡排序是一个稳定的排序方法。
原因:在两两相邻元素比较时,只有前一个比后一个大的时候,才发生交换。如果两者相等是不交换的。所以如果两相等元素初始是a在b的前面,排序完之后,还是a在b的前面。
注意!
这里要设定一个flag值,用来标识一趟中有没有发生交换。如果在其中的一趟中,没有发生交换(所有的两两相邻元素都是前一个比后一个小的话),则说明剩下的数组已经有序,直接返回即可。
void BubbleSort(int A[], int n){
for(int i=0;i<n;i++){
bool flag=true;
for(int j=n-1;j>i;j--)
if(A[j]<A[j-1]){
int temp=A[j];
A[j]=A[j-1];
A[j-1]=temp;
flag=false;
}
if(flag)//flag存在的目的是如果一趟中,没有发生任何交换,说明剩下的数组已经有序,无须再排。
return;
}
}