冒泡排序(Bubble Sort)

Posted Code观天下

tags:

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


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

1.1 算法描述

  • 比较相邻的元素。如果第一个比第二个大,就交换它们两个;

  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;

  • 针对所有的元素重复以上的步骤,除了最后一个;

  • 重复步骤1~3,直到排序完成。

1.2 动图演示


1.3 代码实现

C++版:

//未优化bubbleSort

template<typename T>

void bubbleSort( T arr[] , int n){

    bool swapped;

    do{

        swapped = false;

        for( int i = 1 ; i < n ; i ++ )

            if( arr[i-1] > arr[i] ){

                swap( arr[i-1] , arr[i] );

                swapped = true;

            }

        // 优化, 每一趟Bubble Sort都将最大的元素放在了最后的位置

        // 所以下一次排序, 最后的元素可以不再考虑

        n --;

    }while(swapped);

}

使用newn进行优化:

template<typename T>

void bubbleSort2( T arr[] , int n){

    int newn; // 使用newn进行优化

    do{

        newn = 0;

        for( int i = 1 ; i < n ; i ++ )

            if( arr[i-1] > arr[i] ){

                swap( arr[i-1] , arr[i] );

                // 记录最后一次的交换位置,在此之后的元素在下一轮扫描中均不考虑

                newn = i;

            }

        n = newn;

    }while(newn > 0);

}

java版:

未优化:

public class BubbleSort {

    private BubbleSort(){}

    public static void sort(Comparable[] arr){

        int n = arr.length;

        boolean swapped = false;

        do{

            swapped = false;

            for( int i = 1 ; i < n ; i ++ )

                if( arr[i-1].compareTo(arr[i]) > 0 ){

                    swap( arr , i-1 , i );

                    swapped = true;

                }

            // 优化, 每一趟Bubble Sort都将最大的元素放在了最后的位置

            // 所以下一次排序, 最后的元素可以不再考虑

            n --;

        }while(swapped);

    }

优化:

public class BubbleSort2 {

    private BubbleSort2(){}

    public static void sort(Comparable[] arr){

        int n = arr.length;

        int newn; // 使用newn进行优化

        do{

            newn = 0;

            for( int i = 1 ; i < n ; i ++ )

                if( arr[i-1].compareTo(arr[i]) > 0 ){

                    swap( arr , i-1 , i );


                    // 记录最后一次的交换位置,在此之后的元素在下一轮扫描中均不考虑

                    newn = i;

                }

            n = newn;

        }while(newn > 0);

    }

Python版:


def bubbleSort(alist):

    exchange=False

    for i in range(len(alist)-1,0,-1):

        for j in range(i):

            if alist[j]>alist[j+1]:

                alist[j],alist[j+1]=alist[j+1],alist[j]

                exchange=True

        if not exchange:

            break

    return alist

javascript版:

function bubbleSort(arr) {

var len = arr.length;

for (var i = 0; i < len - 1; i++) {

for (var j = 0; j < len - 1 - i; j++) {

if (arr[j] > arr[j+1]) { // 相邻元素两两对比

var temp = arr[j+1]; // 元素交换

arr[j+1] = arr[j];

arr[j] = temp;

}

}

}

return arr;

}


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

冒泡排序(Bubble sort)

交换排序—冒泡排序(Bubble Sort)

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

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

第四题:冒泡排序(Bubble Sort)

冒泡排序(bubble_sort)——Python实现