算法解析冒泡排序 Bubble Sort

Posted AoHas

tags:

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

     近期在阅读算法的一些书籍,对基础算法整理并分享些学习心得。这篇介绍冒泡排序。欢迎留言交流 


    维基百科对冒泡排序解释:是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢到数列的顶端。


    实现:简单来说,就是比较相邻的两个数字,将最大的数往后移,只到最后一位为止。如下图 


可以看到数组最后一位数字变成了9。继续比较数字9前面的数据。


代码:

        int bubbleSort[9] = {4,6,3,9,7,8,5,1,2};

        int count = 9;

        for (int i=0; i<count; i++) { //要遍历的个数

            for (int j=1; j<(count - i); j++) { //遍历数组并找到最大那个数,并将其移到最后一位

                int left =bubbleSort[j - 1];//当前坐标位置前一个值

                int right = bubbleSort[j]; ////当前坐标位置的值

                if (left > right) {

                    bubbleSort[j] = left;

                    bubbleSort[j-1] = right;

                }

            }

        }


对代码的优化:

//优化1,如果执行遍历数组并找到最大那个数时,发现没有数据可交换,说明此数组已按照从小到大的顺序排列好。

        int bubbleSort[9] = {1,2,3,4,5,6,7,8,9};

        int count = 9;

        bool bBreak = false; //开关,用于判断相邻位置上是否有数据交换

        for (int i=0; i<count; i++) { //要遍历的个数

            bBreak = true;

            for (int j=1; j<(count - i); j++) { //找到数组中最大个那个数,并将其移到最后一位

                int left =bubbleSort[j - 1];//当前坐标位置前一个值

                int right = bubbleSort[j]; ////当前坐标位置的值

                if (left > right) {

                    bubbleSort[j] = left;

                    bubbleSort[j-1] = right;

                    bBreak = false;

                }

            }


            if (bBreak) {

                break;

            }

        }


//优化2,如果比较完相邻位置上的数据后,发现这个位置之后的数据没有发生交换,显然已经有序

        int bubbleSort[9] = {3,2,1,4,5,6,7,8,9};//

        int count = 9;

        bool bBreak = false; //开关,用于判断相邻位置上是否有数据交换

        for (int loopCount=0; loopCount<count; loopCount++) { //要遍历的个数


            bBreak = true;

            int sortIndex = 0; //注意:这个是数组坐标,最大值是count-1. 记录某次遍历时最后发生数据交换的位置


            for (int j=1; j< (count-loopCount); j++) { //找到数组中最大个那个数,并将其移到最后一位

                int left =bubbleSort[j - 1];//当前坐标位置前一个值

                int right = bubbleSort[j]; ////当前坐标位置的值

                if (left > right) {

                    bubbleSort[j] = left;

                    bubbleSort[j-1] = right;

                    bBreak = false;

                    sortIndex = j;

                }

            }


            //两个作用:1.判断当前位置之后的数据是否已经有序。2.如果当前位置之后的数据显然已经有序,重新建立比较过程。

            if (sortIndex < (count-loopCount-1)) {

                count = sortIndex+1;

            }

            if (bBreak) {

                break;

            }


        }



以上是关于算法解析冒泡排序 Bubble Sort的主要内容,如果未能解决你的问题,请参考以下文章

经典排序算法之冒泡排序(Bubble Sort)

冒泡排序 (Bubble Sort)

经典排序算法 - 冒泡排序Bubble sort

冒泡排序(Bubble sort)

Java中的经典算法之冒泡排序(Bubble Sort)

排序算法冒泡排序(Bubble Sort)