算法排序之冒泡排序

冒泡排序

冒泡排序(bubble sort),以升序来说,最后的排列一定是从小到大的。冒泡就是从最低端(数组末尾)开始,相邻的两个元素交换,把小的值放在前面,第一次冒泡就把最小的元素放到最顶端(数组首位)。冒泡排序是交换排序

冒泡的逻辑

1.双层遍历
2.外循环i,比如i=0,就把最小值放到array[0],即每次外循环结束后,都是第i个值(包含0哈)已经放好
3.内循环就是从末尾到i的交换,因为内循环位置肯定是大于等于0,最后一个元素总是j-1,而且j-1最终落到位置i上,因此j>i是一个条件

优缺点

最坏的情况就是升序或者降序排列,做降序或者升序的处理,判断与交换的总次数达到N的平方数
最好的情况也就是正序,外循环1次,内循环n次

最常见的冒泡例子

package com.java.arlgorithm.sort;

import lombok.extern.slf4j.Slf4j;

import java.util.Arrays;

/**
 * @author
 */
@Slf4j
public class BubbleSortTest {
    public static void main(String[] args) {
        int[] array = new int[]{5, 6, 4, 3, 1, 6};
        //printAll(array);
        bubbleSort(array);
        //printAll(array);
    }

    public static void bubbleSort(int[] array) {
        if (array == null || array.length == 0) {
            throw new NullPointerException();
        }
        int len = array.length;
        for (int i = 0; i < len; i++) {
            int tmp;
            for (int j = len - 1; j > i; j--) {
                if (array[j] < array[j - 1]) {
/*                    tmp = array[j];
                    array[j] = array[j - 1];
                    array[j - 1] = tmp;*/
                    swap(array, j, j - 1);
                }
                printAll(array);
            }
        }
    }

    /*    形式参数的交换无法使得真实参数交换
    public static void swap(int src, int des) {
            int tmp = 0;
            tmp = src;
            src = des;
            des = tmp;
        }*/
    public static void swap(int[] array, int src, int des) {
        int tmp;
        tmp = array[src];
        array[src] = array[des];
        array[des] = tmp;
    }

    public static void printAll(int[] array) {
        log.info(Arrays.toString(array));
    }
}

结果

2019-08-19 19:51:10,521   [main] INFO  BubbleSortTest  - [5, 6, 4, 3, 1, 6]
2019-08-19 19:51:10,523   [main] INFO  BubbleSortTest  - [5, 6, 4, 1, 3, 6]
2019-08-19 19:51:10,523   [main] INFO  BubbleSortTest  - [5, 6, 1, 4, 3, 6]
2019-08-19 19:51:10,523   [main] INFO  BubbleSortTest  - [5, 1, 6, 4, 3, 6]
2019-08-19 19:51:10,523   [main] INFO  BubbleSortTest  - [1, 5, 6, 4, 3, 6]
2019-08-19 19:51:10,523   [main] INFO  BubbleSortTest  - [1, 5, 6, 4, 3, 6]
2019-08-19 19:51:10,523   [main] INFO  BubbleSortTest  - [1, 5, 6, 3, 4, 6]
2019-08-19 19:51:10,523   [main] INFO  BubbleSortTest  - [1, 5, 3, 6, 4, 6]
2019-08-19 19:51:10,523   [main] INFO  BubbleSortTest  - [1, 3, 5, 6, 4, 6]
2019-08-19 19:51:10,523   [main] INFO  BubbleSortTest  - [1, 3, 5, 6, 4, 6]
2019-08-19 19:51:10,523   [main] INFO  BubbleSortTest  - [1, 3, 5, 4, 6, 6]
2019-08-19 19:51:10,523   [main] INFO  BubbleSortTest  - [1, 3, 4, 5, 6, 6]
2019-08-19 19:51:10,524   [main] INFO  BubbleSortTest  - [1, 3, 4, 5, 6, 6]
2019-08-19 19:51:10,524   [main] INFO  BubbleSortTest  - [1, 3, 4, 5, 6, 6]
2019-08-19 19:51:10,524   [main] INFO  BubbleSortTest  - [1, 3, 4, 5, 6, 6]

Process finished with exit code 0

冒泡优化

package com.java.arlgorithm.sort;

import lombok.extern.slf4j.Slf4j;

import java.util.Arrays;

/**
 * @author
 */
@Slf4j
public class BubbleSortTest {
    public static void main(String[] args) {
        int[] array = new int[]{5, 6, 4, 3, 1, 6};
        int[] arrayOptmize = new int[]{1, 2, 3, 4, 5, 6};
        //printAll(array);
        //bubbleSort(array);
        bubbleSortOptmize(arrayOptmize);
        //printAll(array);
    }

    public static void bubbleSort(int[] array) {
        if (array == null || array.length == 0) {
            throw new NullPointerException();
        }
        int len = array.length;
        for (int i = 0; i < len; i++) {
            int tmp;
            for (int j = len - 1; j > i; j--) {
                if (array[j] < array[j - 1]) {
/*                    tmp = array[j];
                    array[j] = array[j - 1];
                    array[j - 1] = tmp;*/
                    swap(array, j, j - 1);
                }
                printAll(array);
            }
        }
    }

    public static void bubbleSortOptmize(int[] array) {
        if (array == null || array.length == 0) {
            throw new NullPointerException();
        }
        int len = array.length;
        for (int i = 0; i < len; i++) {
            int tmp;
            boolean flag=false;
            for (int j = len - 1; j > i; j--) {
                if (array[j] < array[j - 1]) {
/*                    tmp = array[j];
                    array[j] = array[j - 1];
                    array[j - 1] = tmp;*/
                    swap(array, j, j - 1);
                    flag = true;
                }
                printAll(array);
                if (flag == false) {
                    return;
                }

            }
        }
    }

    /*    形式参数的交换无法使得真实参数交换
    public static void swap(int src, int des) {
            int tmp = 0;
            tmp = src;
            src = des;
            des = tmp;
        }*/
    public static void swap(int[] array, int src, int des) {
        int tmp;
        tmp = array[src];
        array[src] = array[des];
        array[des] = tmp;
    }

    public static void printAll(int[] array) {
        log.info(Arrays.toString(array));
    }
}

结果

2019-08-19 20:13:15,069   [main] INFO  BubbleSortTest  - [1, 2, 3, 4, 5, 6]

原文地址:https://www.cnblogs.com/JuncaiF/p/11379276.html

时间: 2024-10-28 22:25:20

算法排序之冒泡排序的相关文章

算法 排序(一) 冒泡排序

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法. 算法原理 冒泡排序算法的运作如下:(从后往前) 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有的元素重复以上的步骤,除了最后一个. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较. 时间复杂度 若文件的初始状态是正序的,一趟扫描即可完成排序.所需的关键字比较次数 和记录移动次数均达

算法-排序-1.冒泡排序/2.选择排序/3.插入排序

1.冒泡排序:列表每两个相邻的数,如果前面比后面大,则交换这两个数 一趟排序完成后,则无序区减少一个数,有序区增加一个数 代码关键点:趟,无序区范围 第0趟,无序区没有数 第1趟,无序区1个数 无序去范围: 第i趟,无序区有n-i个数,无序区范围为n-i-1(从0开始,指针不会指到最后一个数) 代码如下: 1 # 时间复杂度:O(n*n) 2 def bubble_sort(li): 3 for i in range(len(li)-1): # 第i趟 4 for j in range(len(

算法——排序(冒泡排序)

冒泡排序的核心就是比较相邻的两个项,如果第一项比第二项大,则交换它们,以此类推元素向上移动到正确的位置,就像气泡冒出的感觉. 举一个简单的例子,有1,5,8,3,2这五个数,按照从小到大的顺序进行排列.代码如下: 1 let arr = [1, 5, 8, 3, 2] 2 3 function swap(arr, index1, index2) { 4 var temp = arr[index1] 5 arr[index1] = arr[index2] 6 arr[index2] = temp

Java常用三种算法排序比较

Java常用三种算法排序比较 冒泡排序: package demo1; /** * * @author xiaoye 2014-5-13 */ /** * 有N 个数据需要排序,则从第0 个数开始,依次比较第0 和第1 个数据, * 如果第0 个大于第1 个则两者交换,否则什么动作都不做,继续比较第 1 个第2个-, * 这样依次类推,直至所有数据都"冒泡"到数据顶上. 冒泡排序的效率 O(N*N ),比较 N*N/2 ,交换N*N/4 . */ public class Bubble

算法 排序lowB三人组 冒泡排序 选择排序 插入排序

参考博客:基于python的七种经典排序算法   [经典排序算法][集锦]     经典排序算法及python实现 首先明确,算法的实质 是 列表排序.具体就是操作的列表,将无序列表变成有序列表! 一.排序的基本概念和分类 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法. 排序的稳定性: 经过某种排序后,如果两个记录序号同等,且两者在原无序记录中的先后秩序依然保持不变,则称所使用的排序方法是稳定的,反之是不稳定

算法——蛮力法之选择排序和冒泡排序c++实现

这次实现的是蛮力法中的两个例子,选择排序法和冒泡排序法,使用的编译环境是vs2013,下面对这两个算法做一个简单介绍,然后是两个算法的c++实现代码. 选择排序法比较的范围是整个列表,每次扫描结束找出最小的一个元素一次放在前面的位置:而冒泡排序法每次是将相邻两个元素进行比较,将较大的元素放在后面,这样一次扫描结束后就将当前最大的那个元素放在了列表的后面. 两个排序方法的算法如下: 选择排序法 SelectionSort(A[0....n-1]) //输入:一个可排序数组A[0....n-1],

图形化排序算法比较:快速排序、插入排序、选择排序、冒泡排序

图形化排序算法比较:快速排序.插入排序.选择排序.冒泡排序

算法效率的分析--【以选择排序与冒泡排序为基础】

在前面我们实现了选择排序与冒泡排序的具体实现,现在我们从数学的角度分析下算法的效率问题: 首先我们把两种排序算法的概念重温一遍: 选择排序:在每一轮中,找出最小的元素放在他最终的位置.挺起来有些别扭,我们举个实例: eg:        8, 5,1, 20, 6, 3 1ed······  1, 5,8, 20, 6, 3 2ed······  1, 3, 8,20, 6,5 3ed······  1, 3,5, 20, 6, 8 4ed······  1, 3,  5, 6,  20,8 5

排序算法系列:冒泡排序与双向冒泡排序

概述 排序算法应该算是一个比较热门的话题,在各个技术博客平台上也都有一些博文进行了一定程度的讲解.但还是希望能从自我完善的角度出发,可以更详细.全面.形象地表达这些算法的精髓.本文就先从最简单的冒泡排序开始说起,别说你已经彻底了解了冒泡排序算法(虽然一开始我也是这样以为的). 版权说明 本文链接:http://blog.csdn.net/lemon_tree12138/article/details/50474230 – Coding-Naga - 转载请注明出处 目录 概述 版权说明 目录 冒