交换排序-冒泡排序

原创 2018年04月15日 15:36:39
  • 时间复杂度:高效的排序算法,比较次数和移动次数都应该尽可能的少。
  • 空间复杂度:算法执行期所需要辅助空间和待排序的数据量无关。理想空间复杂度为O(1)

简述

冒泡排序就如同水中的水泡往水面上浮过程一样,越来越大。冒泡排序是最简单的交换排序,通过两两相邻比较,如果发生逆序则进行交换,如此循环,直至全部排序成功

算法思想

  1. 设定排序数组为r[0··n-1]中,一共n个待排序数。第一躺排序:首先将r[0]与r[1]进行比较,若逆序,则交换r[0]与r[1],然后将r[1]与r[2]进行比较,逆序则交换,一次类推,直到r[n-2]与r[n-1]比较判断后,第一趟排序结束,最后一个数字则最终排序的最后一位值。
  2. 第二趟排序,则是将r[0]到r[n-1],第一步方法进行排序,得到最终排序的r[n-2]位值。
  3. 重复上述比较过程,知道某一趟,没有进行交换为止,说明已经排序结束。

算法实现

public void sort() {
        //待排序数组
        int[] ints = new int[]{1, 33, 44, 55, 6, 2, 3, 22, 77, 88, 123, 54};

        //从小到大
        //最大比较n-1趟
        for (int i = 1; i <= ints.length; i++) {
            System.out.println("第" + i + "趟排序");
            boolean hasChange = false;
            //每一趟比较0到j
            for (int j = 0; j < ints.length - i; j++) {
                if (ints[j] >= ints[j + 1]) {
                    int temp = ints[j];
                    ints[j] = ints[j + 1];
                    ints[j + 1] = temp;
                    hasChange = true;
                }
            }

            if (!hasChange) {
                System.out.println("没有交换,排序完成");
                break;
            }
        }

        for (int intTemp : ints) {
            System.out.print(intTemp + " ");
        }
    }

算法实现一般是两重循环,外层是控制躺数,内层控制比较数。具体如何控制可根据自己的想法去实现。

算法分析

  • 时间复杂度
    • 最好的情况:初始的时候就排序好了,只需要进行一趟比较,且不移动记录
    • 最坏的情况:需要进行n-1趟排序,那么总的关键字比较次数:第一趟n-1次,第二趟n-2次,第三趟n-3次,所以总的为n(n-1)/2约等于n2/2。总的移动次数(假定每次交换都移动3次记录),3n(n-1)/2约等于3n2/2。

所以,最好和最坏平均一下,那么平均情况下,冒泡排序记录移动次数为n2/4和3n2/4。时间复杂度为O(n2)

  • 空间复杂度
    • 由于交换的时候,辅助空间只需要一个来做暂时存储,所以空间复杂度为O(1)

算法特点

  • 是稳定排序
  • 由于是相邻比较,所以可用于链式存储结构
  • 移动次数比较多,算法平均性能比直接插入排序差。当初始记录无序,n较大的时候不适用了

冒泡可以说是最基本的排序手法之一。这个手法想必是各种语言学习的时候都有所使用的,对咱们排序思想有启发作用。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ddxxii/article/details/79949779

【排序三】交换排序(冒泡排序&&快速排序)

【排序一】插入排序(直接插入排序&&希尔排序) 【排序二】选择排序(选择排序&&堆排序) 一、冒泡排序 1、基本思想     冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简...
  • snow_5288
  • snow_5288
  • 2017-03-04 21:45:07
  • 2667

排序高级之交换排序_冒泡排序

冒泡排序(Bubble Sort,台湾另外一种译名为:泡沫排序)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没...
  • u012959829
  • u012959829
  • 2015-01-06 11:02:24
  • 939

排序算法四:交换排序之冒泡排序

排序算法四:交换排序之冒泡排序声明:引用请注明出处http://blog.csdn.net/lg1259156776/引言在我的博文《“主宰世界”的10种算法短评》中给出的首个算法就是高效的排序算法。...
  • LG1259156776
  • LG1259156776
  • 2015-09-25 11:31:11
  • 3070

交换排序之冒泡排序优化源码及时间复杂度

常见的交换排序包括冒泡排序和快速排序。用于显示的代码:show.cpp#include using namespace std;template void showww(T* t, int n) { ...
  • scuyxi
  • scuyxi
  • 2017-04-20 00:04:30
  • 285

数据结构例程——交换排序之冒泡排序

本文是[数据结构基础系列(9):排序]中第4课时[交换排序之冒泡排序]的例程。冒泡排序#include #define MaxSize 20 typedef int KeyType; //定义...
  • sxhelijian
  • sxhelijian
  • 2015-11-30 15:34:08
  • 2462

数据结构——选择排序、插入排序、冒泡排序、快速排序

数据结构——选择排序、插入排序、冒泡排序、快速排序
  • amusi1994
  • amusi1994
  • 2016-12-18 13:37:12
  • 499

【数据结构】交换排序

交换排序的基本思想是:两两比较待排序记录的关键字,如果发生逆序(即排列顺序与排序后的次序正好相反),则交换之,直到所有记录都排好序为止。冒泡排序基本思路:每趟不断将记录两两比较,并按“前小后大”(或“...
  • qq_28602957
  • qq_28602957
  • 2017-03-05 11:45:48
  • 891

java实现排序算法之交换排序(冒泡排序和快速排序)

交换排序是指通过交换元素位置来实现算法的排序:最典型的就是冒泡排序和快速排序,下面分别讲解这两种算法的算法思想,稳定性,时空复杂度和java的实现代码...
  • NFMSR
  • NFMSR
  • 2017-02-18 22:56:40
  • 462

交换排序之--冒泡排序,快速排序

冒泡排序是一种很经典的排序方式了,当然他也是最简单的一种交换式排序,冒泡排序的思想很简单,从前面开始,每每两个数相比,如果前面的大于后面的则交换位置,知道最后一个数,这样一轮排序下来,最大的数就跑到了...
  • zcxwww
  • zcxwww
  • 2016-05-17 18:57:22
  • 486

(交换)冒泡和(选择)简单选择排序比较

(交换)冒泡和(选择)简单选择排序比较: 冒泡排序法的基本思路是:将相邻位置上的关键字进行比较,如果为逆序,则交换,否则继续往下比较,直到序列已经排好。所以,在这个过程中,元素问的比较次数应大于或等...
  • Johnny0991
  • Johnny0991
  • 2015-05-19 18:03:31
  • 1233
收藏助手
不良信息举报
您举报文章:交换排序-冒泡排序
举报原因:
原因补充:

(最多只允许输入30个字)