Java常用算法1——冒泡排序

冒泡排序
时间复杂度:O(n^2)
空间复杂度:O(1),冒泡排序空间效率很高,只需要一个附加程序单元用于交换

思路:

对于一组包含n个数据的记录,冒泡排序在最坏的情况下需要进行n-1趟排序

第1趟:依次比较0和1、1和2、2和3...(n-2)和(n-1)索引的元素,如果发现第1个数据大于第2个数据,交换他们

经过第1趟排序,最大的元素排到了最后

第2趟:依次比较0和1、1和2、2和3...(n-3)和(n-3)索引的元素,如果发现第1个数据大于第2个数据,交换他们

经过第2趟排序,第二大的元素排到了倒数第二个位置

...

第n-1趟:比较0和1索引的元素,如果发现第1个数据大于第2个数据,交换他们

经过第n-1趟排序,第二小的元素排到了第二个位置

冒泡排序是稳定的

代码:

public class BubbleSort {

    private static final int SIZE = 10;

    public static void bubbleSort(int[] nums) {
        int temp;
        for(int i = 1; i < nums.length; i++) {
            for(int j = 0; j < nums.length - i; j++) {
                if(nums[j] > nums[j+1]) {
                    temp = nums[j];
                    nums[j] = nums[j+1];
                    nums[j+1] = temp;
                }
            }
            System.out.print("第" + i + "次排序的结果为:");
            for(int k = 0; k < nums.length; k++) {
                System.out.print("  " + nums[k]);
            }
            System.out.println();
        }
    }

    /**
     * 优化过的冒泡排序
     * 上面的方法中,即使n个数本来就是有序的,也会进行(n-1)次排序
     * 改进:当数组已经有序后,就中断循环
     */
    public static void bubbleSortOptimize(int[] nums) {
        int temp;
        for(int i = 1; i < nums.length; i++) {
            boolean flag = true;
            for(int j = 0; j < nums.length - i; j++) {
                if(nums[j] > nums[j+1]) {
                    temp = nums[j];
                    nums[j] = nums[j+1];
                    nums[j+1] = temp;
                    flag = false;
                }
            }
            if(flag) {
                // 如果某趟没有交换,说明数组已经有序
                break;
            }
            System.out.print("第" + i + "次排序的结果为:");
            System.out.println(Arrays.toString(nums));
        }
    }

    public static void main(String[] args) {
        int[] nums = ArraysUtil.makeIntArray(10, 100, SIZE);
        System.out.print("排序前的数组为:");
        System.out.println(Arrays.toString(nums));
//      bubbleSort(nums);
        bubbleSortOptimize(nums);
        System.out.print("排序后的数组为:");
        System.out.println(Arrays.toString(nums));
    }
}

生产数组的工具类:

import java.util.Random;

/**
 * 操作数组的工具类
 */
public class ArraysUtil {

    private static Random rand = new Random();

    /**
     * 返回长度为size,并且数组中元素的大小范围为[begin, end)的int数组
     */
    public static int[] makeIntArray(int begin, int end, int size) {
        int[] nums = new int[size];
        for(int i = 0; i < size; i++) {
            nums[i] = begin + rand.nextInt(end - begin);
        }
        return nums;
    }
}
时间: 2024-05-04 11:50:11

Java常用算法1——冒泡排序的相关文章

java快速排序算法与冒泡排序算法比较

首先看下,冒泡排序算法与快速排序算法的效率: 如下的是main方法  代码如下 复制代码 /**   *  * @Description:  * @author:cuiyaonan2000@163.com  * @date 2014年11月5日 下午1:02:10   */  public static void main(String[] args) {   //快速排序算法测试   int[] qArray = new int[100000];   for (int i = 0; i < 1

java常用算法

冒泡排序: //降序 public static int[] bubbleSort(int[] array){ for(int i = 0; i < array.length; i++){ int curval = array[i]; for(int j = i - 1; j >= 0; j--){ int temp = array[j]; if(curval > temp){ array[j] = curval; array[j+1] = temp; } } } return arra

图解程序员必须掌握的Java常用8大排序算法_java

这篇文章主要介绍了Java如何实现八个常用的排序算法:插入排序.冒泡排序.选择排序.希尔排序 .快速排序.归并排序.堆排序和LST基数排序,分享给大家一起学习. 分类1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空间最多:归并排序 所需辅助空间最少:堆排序 平均速度最快:快速排序 不稳定:快速排序,希尔排序,堆排序. 先来看看8种排序之间的关系: 1.直接插入排序 (1)基本思想:

Java常用排序算法及性能测试集合_java

现在再回过头理解,结合自己的体会, 选用最佳的方式描述这些算法,以方便理解它们的工作原理和程序设计技巧.本文适合做java面试准备的材料阅读. 先附上一个测试报告: Array length: 20000bubbleSort : 766 msbubbleSortAdvanced : 662 msbubbleSortAdvanced2 : 647 msselectSort : 252 msinsertSort : 218 msinsertSortAdvanced : 127 msinsertSor

Java经典算法汇总之冒泡排序_java

原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后.重复第一趟步骤,直至全部排序完成. 举例说明:要排序数组:int[]arr={6,3,8,2,9,1}; 第一趟排序: 第一次排序:6和3比较,6大于3,交换位置:368291 第二次排序:6和8比较,6小于8,不交换位置:36

Java实现的各种排序算法(插入排序、选择排序算法、冒泡排序算法)_java

一.插入排序算法实现java版本 public static int[] insert_sort(int[] a) { for (int i = 0; i < a.length; i++) { for(int j=i+1;j>0&&j<a.length;j--) { if(a[j]<a[j-1]) { int tmp = a[j]; //这样定义初始化逻辑上是可以的,j变量,每次tmp的值变化的 a[j] = a[j-1]; a[j-1] = tmp; } } }

Java排序算法总结之冒泡排序_java

本文实例讲述了Java排序算法总结之冒泡排序.分享给大家供大家参考.具体分析如下: 前言:冒泡排序(BubbleSort)就是依次比较相邻的两个数,将小数放在前面,大数放在后面. 下面让我们一起    来看冒泡排序在Java中的算法实现. 冒泡排序是计算机的一种排序方法,它的时间复杂度为O(n^2),虽然不及堆排序.快速排序的O(nlogn,底数为2),但是有两个优点: 1."编程复杂度"很低,很容易写出代码: 2.具有稳定性,这里的稳定性是指原序列中相同元素的相对顺序仍然保持到排序后

我的Java开发学习之旅------&amp;gt;Java经典排序算法之冒泡排序

冒泡排序(Bubble Sort)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端. 一.算法原理 冒泡排序算法的运作如下: 1.比较相邻的元素.如果第一个比第二个大,就交换他们两个. 2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 3.

PHP面试常用算法(推荐)_php实例

一.冒泡排序 基本思想: 对需要排序的数组从后往前(逆序)进行多遍的扫描,当发现相邻的两个数值的次序与排序要求的规则不一致时,就将这两个数值进行交换.这样比较小(大)的数值就将逐渐从后面向前面移动. //冒泡排序 <?php function mysort($arr) { for($i = 0; $i < count($arr); $i++) { $isSort = false; for ($j=0; $j< count($arr) - $i - 1; $j++) { if($arr[$