冒泡排序算法小优化

冒泡排序算法是个入门的排序算法,可能是很多人接触过的第一个排序算法,算法本身很简单,主要步骤如下:

1、从前到后遍历数组,依次比较当前元素和
下一个元素。如果当前元素大于下一个元素,
则对调当前元素和下一个元素;如果当前元素
不大于下一个元素,什么也不用做,继续遍历
下一个元素。这样经过一轮遍历后,最大的元
素就排到了数组的尾部,找到了最大的元素。
2、重复第一步,依次找到第二大、第三大等
元素等等,并放到适当的位置。

算法的动图(网上找的)演示如下:

冒泡排序动图演示

常规排序代码如下:

    int arr[] = {2, 4, 0, 5, 7, 1, 3, 8, 9};
    int len = sizeof(arr) / sizeof(arr[0]);
    int max = len;

    while (max > 0) {
        for (int i = 0; i < max - 1; i++) {
            if (arr[i] > arr[i + 1]) {
                int temp = arr[i];
                arr[i] = arr[i + 1];
                arr[i + 1] = temp;
            }
        }

        max--;
    }

接下来说下可以优化的点,如果这个数组的前部分本身就是有序的,只是后面一部分元素是乱序的,其实本必要做完所有轮次的排序,可以提早结束遍历,提高程序性能。提高结束遍历的条件是:

如果某轮排序结束后,在本轮排序中,没有需要
发生元素顺序的调换,那么就可以认为当前的数
组中,所有元素都是有序的了,可以退出遍历。

优化后的代码为:

    int arr[] = {2, 4, 0, 5, 7, 1, 3, 8, 9};
    int len = sizeof(arr) / sizeof(arr[0]);
    int max = len;

    while (max > 0) {
        int replace = 0;

        for (int i = 0; i < max - 1; i++) {
            if (arr[i] > arr[i + 1]) {
                int temp = arr[i];
                arr[i] = arr[i + 1];
                arr[i + 1] = temp;
                replace++;
            }
        }

        if (replace == 0) {
            break;
        }

        max--;
    }

以程序的测试数据为例,优化前,循环次数为36次,优化后,循环次数减少到30次,减少6次,减少16.67%的循环次数。如果数组乱序程度不是很大的情况下,减少的幅度应该是比较可观的。


优化前冒泡排序过程

优化后冒泡排序过程

展开阅读全文

页面更新:2024-03-13

标签:算法   轮次   遍历   数组   演示   元素   次数   过程   结束   代码

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top