冒泡排序还能优化???

Posted 南风念

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了冒泡排序还能优化???相关的知识,希望对你有一定的参考价值。

今天我们来聊聊冒泡排序算法,数据结构与算法是每个IT人的必经之路,而冒泡排序是这条路上第一个“小怪”,所以让我们一起秒掉它。


冒泡排序算法原理:

设数组长度为N。

1、比较相邻的前后两个数据,如果前面数据大于后面的数据,就将这两个数据交换。

2、这样对数组的第0~N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组最后一位即N-1的位置。(相当小的数据往前跑了)

3、N = N-1,如果N不为0就重复前面两步,否则排序完成。


记得当时学冒泡排序的时候是用两个for循环解决的。像这样:

for( int i = 0; i < n-1; ++i )
{
    for( int j = 0; j <  n-1-i; ++j )
    {
        if( a[j] > a[j+1] )
        {
            int temp = a[j];
            a[j] = a[j+1];
            a[j+1] = temp;
        }
    }
}

当时也没想太多,但最近才发现,原来这么简单的算法也是可以优化的!下面请欣赏CSDN上某位大佬的讲解(链接在文末):

(——注意细节)

void BubbleSort1(int a[], int n)
{
    int i, j;       
    for (i = 0; i < n; i++)              
        for (j = 1; j < n - i; j++)                     
            if (a[j - 1] > a[j])                            
                Swap(a[j - 1], a[j]);
}

下面对其进行优化,设置一个标志,如果这一趟发生了交换,则为true,否则为false。明显的,如果有一趟没有发生交换,说明排序已经完成。

void BubbleSort2(int a[], int n){
    int j, k;
    bool flag;
    k = n;
    flag = true;
    while (flag)
    {              
        flag = false;
        for (j = 1; j < k; j++)
        {
            if (a[j - 1] > a[j])
            {
                 Swap(a[j - 1], a[j]);
                 flag = true;
             }
         }
         k--;
    }
}

再做进一步的优化。如果有100个数的数组,仅前面10个无序,后面90个都已排好序且都大于前面10个数字,那么在第一趟遍历后,最后发生交换的位置必定小于10,且这个位置之后的数据必定已经有序了,记录下这位置,第二次只要从数组头部遍历到这个位置就可以了。

void BubbleSort3(int a[], int n){
    int j, k; 
    int flag;  
    flag = n;
    while (flag > 0) {
        k = flag;
         flag = 0;
         for (j = 1; j < k; j++)
             if (a[j-1] > a[j])
             {
                Swap(a[j-1], a[j]);
                flag = j;
             }
    }
}

到这里,优化方法已经讲完了,是不是想为原作的智慧点赞!不过,冒泡排序毕竟是一种效率低下的排序方法,在数据规模很小时,可以采用。数据规模比较大时,最好用其它排序方法。


原文链接:https://blog.csdn.net/MoreWindows/article/details/6657829


江湖虽大,终会再见

温故而知新,可以为师矣,

扫描下方二维码加关注,方便随时回顾


以上是关于冒泡排序还能优化???的主要内容,如果未能解决你的问题,请参考以下文章

给自己五分钟,彻底搞懂并优化冒泡排序

给自己五分钟,彻底搞懂并优化冒泡排序

给自己五分钟,彻底搞懂并优化冒泡排序

冒泡排序,算法以及优化

冒泡排序及其优化

如何优化冒泡排序?