前言:
当我们采用前面的选择排序时,我们仍然要将候选者遍历 5 遍,才能完成最终的排序,但其 实,本身这些数据除了第一个外,已经很有序了,我们只需要把第一个和第二个交换,然后又和 第三个交换,如此循环,直到和最后一个交换后,整个数组基本就有序了!
当然,并不是每次都这么幸运,像下面的情况就会更复杂一些,一趟并不能完全解决问题, 我们需要多趟才能解决问题.
此时,我们只保障了最后一个数是最大的, 并不能保障前面的数一定会有序,所以,我们继续按 照上面五步对剩下的 5 个数继续进行一次排序,数组就变得有序了.
以上过程就是冒泡排序: 通过重复地遍历未排序的数列,一次比较两个元素,如果它们的顺 序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列 已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢得像泡泡一样“浮”到数 列的顶端,故而得名!
简单的说就是:每次在要排序的数据中,两个两个的进行比较,选出最大的(或最小的)然后与其相邻的下一个进行比较。重复实现上述步骤,直到将最大的或最小的放到头部(或尾部)。然后再重复上述步骤,直到数据变成有序的。但每次排过序的数据,就不需要在进行排序了。
代码实现
1.普通版
void BubbleSort(int arr[], int len) {
for (int i = 0; i < len - 1; i++) {
//注意条件是j<len-1-i防止越界
for(int j=0;j<len-1-i;j++){
//如果arr[j]大于它后面的则调换位置
if(arr[j]>arr[j+1]{
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}
2.优化版
void BubbleSort(int arr[], int len) {
for (int i = 0; i < len - 1; i++) {
bool sorted=true;
//注意条件是j<len-1-i防止越界
for(int j=0;j<len-1-i;j++){
//如果arr[j]大于它后面的则调换位置
if(arr[j]>arr[j+1]{
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
sorted=false;
}
}
//说明剩下要排序的数据,是有序的
if(sorted)
break;
}
}
优化版相对于普通版来说,有明显的的优势。可以很好解决我们
前面提到的问题。当排序N次后发现循环还没结束,但剩下要进行
排序的数据已经是有序的了。就可以及时结束排序,避免了一些
不必要的开支。