冒泡排序的改进

Posted 机房日子青少年编程

tags:

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

        冒泡排序的基本思想就是依次比较相邻两个元素,不符合排序结果要求的元素就交换。

基本冒泡程序:

void bubblesort(int arr[], int length)

{

    for (int i = 0; i < length - 1; i++)

        for (int j = 0; j < length - i - 1; j++)

            if (arr[j] > arr[j + 1])

                Swap(arr[j], arr[j + 1]);

}

     如果在冒泡排序的基础上加上一个交换标志,如果在本次循环中没有发生过交换(所有的元素都有序),则不用进行下一次循环,结束排序。

     最好情况时间复杂度为O(n),最坏和平均情况时间复杂度为O(n^2)。

改进一:

void bubblesort1(int arr[], int length)

{

    bool f= 0;

    for (int i = 0; i < length - 1 && !f; i++)

    {

        f= 1;

        for (int j = 0; j < length - i - 1; j++)

            if (arr[j] > arr[j + 1])

            {

                swap(arr[j], arr[j + 1]);

                f= 0;

            }

    }

}

     如果在改进方法一的的基础上再次进行改进,每次循环记录最后一次发生交换的元素的位置,这说明这之后的元素已经有序,下一次循环不用比较这些元素。

改进二:

void bubblesort2(int arr[], int length)

{

    int cur, j, last = length - 1;

    while (last > 0)

    {

        for (j = cur = 0; j < last; j++)

            if (arr[j] > arr[j + 1])

            {

                swap(arr[j], arr[j + 1]);

                cur = j;

            }

        last = cur;

    }

}

    在改进二的基础上继续改进,每次循环不仅从前向后扫描记录最后一次发生交换的元素的位置up,而且从后向前扫描记录再次扫描记录最前面发生交换的元素的位置low,这样两侧的元素已经有序,当low>=up的时候证明整个数组有序。

    时间复杂度和方法3一样,最好情况时间复杂度为O(n),最坏和平均情况时间复杂度为O(n^2)。

改进三:

void bubblesort3(int arr[], int length)

{

    int low, up, index;

    low = index = 0;

    up = length - 1;

    while (up > low)

    {

        for (int i = low; i < up; i++)

            if (arr[i] > arr[i + 1])

            {

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

                index = i;

            }

        up = index;

        for (int i = up; i > low; i--)

            if (arr[i] < arr[i - 1])

            {

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

                index = i;

            }

        low = index;

    }

}

 






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

交换排序 —— 冒泡排序 + 改进

冒泡排序的改进

冒泡排序以及改进

关于冒泡排序的改进

冒泡排序算法及改进

改进冒泡排序的运行时间分析