冒泡排序的简介和2种写法以及冒泡优化

冒泡排序,是将数组由小到大,或由大到小的一种排序算法。
假设排序是由小到大排序,冒泡算法的主要逻辑是,假设有N个数,游标从第一位数开始,若左边的数比右边的数大,则左边交换,游标移向下一位直到最后一位。在游标移动过程中,可以保证,右边的数一定比左边的数大,因为第一轮遍历是要找出最大的数,并且最大的数在最后一位。同理,要找出第二大的数,重复上述过程,直至找出第N大的数,排序结束。因此时间复杂度是N*N,空间复杂度是N。

假如有几个数字int score[] = {66,75, 77, 99}; 按照从大到小排序。

有2种思路,第一种,score[j] 和 score[j+1] 比较 如果 前者比后者小,把前者和后者调换顺序,两两调换后一轮下来 最小的会被排到最后去。每一轮j都从0开始,当i轮排序,就有最后面的i个数字因为他是最小的,所以后面的每轮都不用理他了,也就是 score.length-1-i 往后的数不用管了,如上,第一轮有4个数字 i为0 ,那么score.length-1-i 为3,也就是下标是3以后的可以不用管,3往后没有数字,所以第一轮所有的数字都要参加比较,第二轮I=1 score.length-1-i 为2 也就是说 下标2后面的 下标为3的数字不用比了,因为两两比较厚,66会到 score[3],实现代码如下:

for(int i =0;i < score.length - 1;i++)
{
for(int j = 0;j < score.length - 1-i;j++)// j开始等于0,
{
if(score[j] < score[j+1])
{
int temp = score[j];
score[j] = score[j+1];
score[j+1] = temp;
}
}
}

第二种思路,用99 和 77 比较,在和66比较 在和 75 比较,发现99是最大的,吧他排到第一位(index=0的位置),然后i=1,也就是第二轮,就不用看下标为0的99了因为他是老大,然后接着比较。;
for(int i =0;i < score.length - 1;i++)
{
for(int j = (score.length - 2);j >= i;j–)
{
if(score[j] < score[j+1])
{
int temp = score[j];
score[j] = score[j+1];
score[j+1] = temp;
}
}
}

说明下j为啥=
(score.length - 2)
因为length=4,我最多能让下标2和下标3的数字比较(j+1最大等于3),也就是4-2=2 j最大=2,2和2+1比较 然后1和2比较,然后 0和1 比较。

由于冒泡排序时间复杂度是O(n^2),对于大规模的排序是难以胜任的。
这里我做过测试,仅仅是10万量级的数据,冒泡排序就让人等得要死,但是其也并非一无是处,其适用于较小规模的数据,同时也是非常好实现的排序算法,重要的是能够和其他算法形成鲜明的对比,大雾~~

–Test for Random Array, Scope:100000 Random Range: [0, 100000]
heapSortInPlace:0.028s
heapSort2:0.029s
heapSort:0.03s
quickSort3Ways:0.039s
quickSort2:0.027s
quickSort:0.034s
shellSort:0.033s
mergeSort:0.046s
insertionSort:9.158s
selectionSort:17.791s
bubbleSort:50.365s

–Test for Random Array, Scope:100000 Random Range: [0, 20]
heapSortInPlace:0.025s
heapSort2:0.028s
heapSort:0.031s
quickSort3Ways:0.039s
quickSort2:0.028s
quickSort:0.029s
shellSort:0.033s
mergeSort:0.045s
insertionSort:9.126s
selectionSort:17.779s
bubbleSort:50.2s

–Test for Nearly Ordered Array, Scope:100000 Range: [0, 100000]
heapSortInPlace:0.019s
heapSort2:0.02s
heapSort:0.03s
quickSort3Ways:0.033s
quickSort2:0.018s
quickSort:0.019s
shellSort:0.006s
mergeSort:0.002s
insertionSort:0.002s
selectionSort:17.8s
bubbleSort:18.254s

关于冒泡排序的优化,主要针对的是其交换的场合,如果说输入的数几乎是有序的,在排序的过程中其已经有序了,就让其循环提前终止,这是第一种思路。

//冒泡排序的优化版本,当输入的数组本身是有序的时候,及时退出
void bubbleSort5(vector& vec, int n){
bool flag=false;
for (int i=n-1; i>0; –i){
flag=false;
for (int j=0; j

猜你喜欢

转载自blog.csdn.net/qq_40714770/article/details/82077647