冒泡排序算法以及它的优化方案(代码片段)

sysocjs sysocjs     2022-12-19     514

关键词:

一、什么是冒泡排序?

冒泡排序(Bubble Sort)是一种最为基础的交换排序,相信学过C语言的,都接触过这种排序算法。

这篇文章重点应该放在优化上面。

二、冒泡排序的实现思想:

将数组里面相邻的元素两两比较,根据大小来交换元素位置,举个栗子:

这里有一个数组array[4, 6, 5, 8, 9, 3, 2, 1, 7]

首先4和6比较,4小于6,位置不变,接下来6和5比较,6大于5,所以6和5的位置对调,数组变成[4, 5, 6, 8, 9, 3, 2,1, 7],由于6和5位置对调,接着是6和8比较,6小于8,所以位置不变,如此类推,第一轮排序后,数组变成[4,  5, 6, 8, 3, 2, 1, 7, 9],第二轮又从第一个元素4开始比较,但是最终比较的元素不是9而是7,因为第一轮比较,已经是确定将最大的元素放到了最后的位置,所以没有必要与最后的元素进行比较,这一轮最终结果为[4, 5, 6, 3, 2, 1, 7, 8, 9],

如此类推,完成全部排序总共需要array.length x( array.length-1)/2次比较(这个是等差数列计算出来的,有兴趣的可以自己算一下)。因为每一轮都要全部比较,所以最原始的冒泡排序叫做稳定排序。

根据这种原始思想,可以得到冒泡排序的原始版

public void sortArray(int[] array)
    int temp;
    for(int i=0; i<array.length; i++)
        for(int j=0; j<array.length-i-1; j++)
            if(array[j] > array[j+1])
                temp = array[j];
                array[j] = array[j+1];
                array[j+1] = temp;
            
        
    

我们把每一轮结果罗列出来时,

第三轮结果:[4, 5,  3,  2, 1, 6, 7, 8, 9]

第四轮结果:[4, 3,  2, 1, 5,  6, 7, 8, 9]

第五轮结果:[3, 2, 1, 4,  5,  6, 7, 8, 9]

第六轮结果:[2, 1, 3, 4,  5,  6, 7, 8, 9]

第七轮结果[1, 2, 3, 4,  5,  6, 7, 8, 9]

第八轮结果:[1, 2, 3, 4,  5,  6, 7, 8, 9]

从结果可以看出,程序做了些“无用功”,为了避免程序做这些“无用功”,要对基础版本程序作出一些修改,

优化第一版:

 

public void sortArray(int[] array)
    int temp;
    for(int i=0; i<array.length; i++)
        boolean isSorted = true;
        for(int j=0; j<array.length-i-1; j++)
            if(array[j] > array[j+1])
                temp = array[j];
                array[j] = array[j+1];
                array[j+1] = temp;
                isSorted = false;
            
        
        if(isSorted)
            break;
        
    

 

程序定义了一个boolean类型的isSorted变量,用来判断往后的循环当中,数组是否已经是有序的,每一轮循环都会设置其值为true,当有元素对调位置时,就将isSorted的值设置为false,表示该数组还不是有序数组。每一轮都要判断isSorted的值,如果判断当前一轮操作没有元素有位置调换,那么可以提前结束所有的循环。当然,本次栗子中用到的数组还是需要进行8轮循环,因为,第7轮的时候isSorted的值会被设置为false,到了第八轮才是true,读者可以自行举例别的数组检验。

还是拿回每一轮运行结果出来:

第三轮结果:[4, 5,  3,  2, 1, 6, 7, 8, 9]

第四轮结果:[4, 3,  2, 1, 5,  6, 7, 8, 9]

第五轮结果:[3, 2, 1, 4,  5,  6, 7, 8, 9]

第六轮结果:[2, 1, 3, 4,  5,  6, 7, 8, 9]

第七轮结果[1, 2, 3, 4,  5,  6, 7, 8, 9]

第八轮结果:[1, 2, 3, 4,  5,  6, 7, 8, 9]

这里讲解得详细一点,以第三轮结果,在第四轮运行操作中,4和5比较,4<5,不调换位置,5和3比较,5>3,位置对调,数组变成[4, 3, 5,  2, 1, 6, 7, 8, 9],5和2比较,5<2,位置对调,变成[4, 3, 2, 5, 1, 6, 7, 8, 9],5和1比较,5>1,位置对调,变成[4, 3, 2, 1, 5, 6, 7, 8, 9]。后面就是5和6比较,6和7比较,7和8比较,8和9比较,但是这四次比较对数组排序都没有任何“贡献”,同理,在第五轮循环操作中,没有“贡献”的操作会增加一次,这是不希望出现的。

这里要介绍一个概念——有序区,有序区指数组有序的区域,这里只数组末尾的有序元素组成的区域,在极端的情况,如[9, 8, 7, 6, 5, 4, 3, 2, 1],按照从小到大顺序排序,每一轮排序,有序区只增加一位元素,但更多的情况有序区元素是大于循环轮次,当有序区元素等于数组长度时,可以认为这个数组已经排序完成,所以下面给出第二次优化,

优化第二版:

public void sortArray(int[] array)
    int border = array.length-1;
    int lastIndex = 0;
    int temp;
    for(int i=0; i<array.length; i++)
        boolean isSorted = true;
        for(int j=0; j<border; j++)
            if(array[j] > array[j+1])
                temp = array[j];
                array[j] = array[j+1];
                array[j+1] = temp;
                
                lastIndex = j;
                isSorted = false;
            
        
        border = lastIndex;
        if(isSorted)
            break;
        
    

这一版新增了两个int类型变量,一个是border,表示无序项的边界,同时也是每一轮循环的次数设定值,另一个是lastIndex,用来记录最后元素需要交换的下标值,进行一轮循环后,将这个值赋值给border,作为下一轮循环的次数。每一轮循环,当有元素需要调换位置时,记录j的位置,当前轮次循环结束,就将lastIndex赋值给border,最为新一轮循环操作的边界。

以第五轮结果为栗子,[3, 2, 1, 4,  5,  6, 7, 8, 9]

在进行第六轮循环操作时,3和2比较,3>2,位置对调,变成[2, 3, 1, 4,  5,  6, 7, 8, 9],此时lastIndex = j = 0,3和1比较,3>1,位置对调,变成[2, 1, 3, 4,  5,  6, 7, 8, 9],此时lastIndex = j = 1,3和4比较,3<4,位置不变,如此类推,本轮循环结束时,lastIndex = 1,那么此时border = 1,在第七轮循环里面,只需要进行1次比较就可以结束第七轮循环。

但是,优化第二版仍不是最优方案,上面的两种优化方案只是减少每轮的操作次数,还有一种可以直接减少循环的轮数,那就是鸡尾酒算法排序,这个留到下一篇更新。

 


冒泡排序以及冒牌排序优化算法(代码片段)

冒泡排序是最常用的排序算法,在笔试中也非常常见,能手写出冒泡排序算法可以说是基本的素养。算法重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来,这样越大的元素会经由交换慢慢... 查看详情

排序算法总结(代码片段)

1.冒泡排序冒泡排序是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。优化版的冒泡排序Java实现,增加了一个标记变量flag,内层循环没有改变,则直接退出循环。priva... 查看详情

算法——冒泡排序(代码片段)

文章目录【1】没有经过优化的冒泡排序:【2】优化后的冒泡排序:【3】测试结果:优化后:(30次)优化前:(45次)打印函数://打印publicstaticvoidprin(int[]arr)System.out.println("数组如下... 查看详情

图解算法系列之冒泡排序(优化版)(代码片段)

算法描述在第一层循环中设置一个变量,只要该序列局部有序就不需要进行排序了,提前终止循环。图解算法略.C/C++代码实现Custom.hvoidBubbleSortAdvanced(intarr[],intnumber);Custom.cppvoidBubbleSortAdvanced(intarr[],intnumber)boolexchange;for(inti=0;i<num... 查看详情

算法——冒泡排序与快速排序的分析(代码片段)

目录冒泡排序冒泡排序的总结:快速排序1.hoare版本2.挖坑法3.前后指针法快排优化优化一: 三数取中优化二:小区间优化快速排序的总结冒泡排序冒泡排序的基本思想时:冒泡排序的步骤很简单,只需要将较... 查看详情

给自己五分钟,彻底搞懂并优化冒泡排序(代码片段)

给自己五分钟,彻底搞懂并优化冒泡排序冒泡排序思想算法描述示例冒泡排序的Java代码实现冒泡排序的第一次优化冒泡排序弊端冒泡排序第一版优化冒泡排序第二次优化冒泡排序第二版优化冒泡排序思想给定一个无序数组&#x... 查看详情

排序算法之冒泡排序(代码片段)

前言排序算法中最最常见也算是入门的一个排序算法就是冒泡排序。这篇文章我们就来好好地写写这个冒泡排序算法,以及冒泡排序呢的改进算法。传统冒泡算法staticint[]array=100,1,5,4,11,2,20,18,89,34,20,34;@TestpublicvoidbubbleSortNormal()intt... 查看详情

❤️「冒泡排序」中的「算法思维」❤️(代码片段)

文章目录零、📃前言一、🎯简单释义二、🧡核心思想三、🔆动图演示四、🌳算法前置五、🥦算法描述六、🧶算法分析七、🧢优化方案八、💙代码实践九、💗代码验证零、📃前言 ... 查看详情

冒泡排序(bubblesort)算法以及简单选择排序(selectsort)算法实现(c语言)(代码片段)

一、冒泡排序从后往前(或从前往后)两两比较相邻元素的值,若为逆序(即A[i-1]>A[i]),则交换它们,直到序列比较完。称这样过程为“一趟”冒泡排序。(二)算法实现//交换voidswap(int&... 查看详情

冒泡排序算法(代码片段)

冒泡排序有三种写法:一边比较一边向后两两交换,将最大值/最小值冒泡到最后一位;经过优化的写法:使用一个变量记录当前轮次的比较是否发生过交换,如果没有发生交换表示已经有序,不再继续排... 查看详情

❤️万字详解「冒泡排序」,深入浅出「算法思维」❤️(代码片段)

...1f499;代码实践九、💗代码验证零、📃前言  「冒泡排序」是最好理解且编码最简单的排序算法,所以一 查看详情

给自己五分钟,彻底搞懂并优化冒泡排序(代码片段)

给自己五分钟,彻底搞懂并优化冒泡排序冒泡排序思想算法描述示例冒泡排序的Java代码实现冒泡排序的第一次优化冒泡排序弊端冒泡排序第一版优化冒泡排序第二次优化冒泡排序第二版优化冒泡排序思想给定一个无序数组&#x... 查看详情

冒泡排序和优化(代码片段)

冒泡思想:两两比较相邻记录,内循环将最小的数通过交换浮上来。 优化思想:设置flag,对已经有序的序列就不继续判断了冒泡排序的实现:packageBubble_Sort;//冒泡算法和改进算法,正序,从小到大(从1开始)publicclassBubbleSortpubl... 查看详情

数据结构排序(代码片段)

排序三.交换排序1.冒泡排序概念及分析算法分析小结2.快速排序概念算法分析与实现1.hoare版本2.挖坑法3.前后指针版本快速排序代码的优化快速排序的非递归实现小结在认识了插入排序和选择排序后,我们再来了解一下交换排... 查看详情

排序(上):冒泡排序插入排序和选择排序(代码片段)

如何分析一个排序算法?分析一个排序算法的三要素:排序算法的执行效率、排序算法的内存消耗以及排序算法的稳定性。排序算法的执行效率对于排序算法执行效率的分析,一般是从以下三个方面来衡量:最好情况、最坏情况... 查看详情

javascript冒泡排序原理以及应用(代码片段)

一原理:一解析:要点:1、算法:算法是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。通俗一点,算法就是通过表面现象发现问题的本质问题。2、声明数组的格式:... 查看详情

算法分类,时间复杂度,空间复杂度,优化算法(代码片段)

...算法  4,算法实例一,算法有哪些  常见的算法有冒泡排序,快排,归并,希尔,插入,二分法,选择排序,广度优先搜索,贪婪算法,这些都是新手入门必须要了解的,你可以不会,但是你必须要知道他是怎么做到的,原理是什么,今天... 查看详情

详解java算法之冒泡排序(bubblesorting)(代码片段)

冒泡排序基本介绍冒泡排序(BubbleSorting)的基本思想是通过对待排序序列从前向后(从下表较小的元素开始),以此比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前向后部,就像水底下的气... 查看详情