正宗冒泡排序算法总结

关于冒泡排序的工作原理有几种,有的资料说是第k+x个位置与第k个位置比较(x>0的自然数),符合交换条件就交换。有的资料说是第k+1个位置与第k个位置比较。

  • 我刚查资料总结了一下。我觉得既然是冒泡,那就应该所有元素每一趟排序就应该最多往上冒一层。不可能是从水底直接冒到水面。
  • 所以正确的排序思想应该是:相邻的两个元素相比较,符合冒泡才冒泡(交换)。

根据上述的正宗原理:第一次得出的代码应该是:

package com.you.test;

public class test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        int[] a = {8,1,6,2,5,7,3,4,9};
        int tmp = 0;//缓存区

        for(int i=0;i<a.length;i++){
            for(int j=0;j<a.length-1;j++){
                if (a[j]>a[j+1]) {//符合冒泡,进行一次冒泡
                    tmp = a[j];
                    a[j] = a[j+1];
                    a[j+1] = tmp;
                }
            }
            //这一趟排序结束
            printa(a);
        }

    }

    public static void printa(int[] a) {
        for(int i=0;i<a.length;i++){
            System.out.print(" "+a[i]);
        }
        System.out.println("");
    }

}

运行结果:而且时间复杂度:n*n

  1. 解决内外循环次数问题。改进如下:
  2. package com.you.test;
    
    public class test {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            int[] a = {8,1,6,2,5,7,3,4,9};
            int tmp = 0;//缓存区
    
            //大(小)的数一直往下沉,直到底,小(大)的数一层层往上冒。所以尾部部分是排好序的。
            for(int i=0;i<a.length-1;i++){
                for(int j=0;j<a.length-i-1;j++){
                    if (a[j]>a[j+1]) {//符合冒泡,进行一次冒泡
                        tmp = a[j];
                        a[j] = a[j+1];
                        a[j+1] = tmp;
                    }
                }
                //这一趟排序结束
                printa(a);
            }
    
        }
    
        public static void printa(int[] a) {
            for(int i=0;i<a.length;i++){
                System.out.print(" "+a[i]);
            }
            System.out.println("");
        }
    
    }

    运行结果:内部循环次数变小,外部不变

  3. 无效循环还是存在,接下来对无效循环改进:代码:

  4. package com.you.test;
    
    public class test {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            int[] a = {8,1,6,2,5,7,3,4,9};
            int tmp = 0;//缓存区
            boolean is_changed = true;//冒泡标识,
    
            //大(小)的数一直往下沉,直到底,小(大)的数一层层往上冒。所以尾部部分是排好序的。
            while(is_changed){
                is_changed = false;
                for(int j=0;j<a.length-1;j++){
                    if (a[j]>a[j+1]) {//符合冒泡,进行一次冒泡
                        tmp = a[j];
                        a[j] = a[j+1];
                        a[j+1] = tmp;
                        is_changed = true;//有元素冒泡,
                    }
                }
                //这一趟排序结束
                printa(a);
            }
        }
    
        //打印
        public static void printa(int[] a) {
            for(int i=0;i<a.length;i++){
                System.out.print(" "+a[i]);
            }
            System.out.println("");
        }
    
    }

    运行结果:



  5. 到这里就可以就可以完美完成冒泡的改进啦。。。。
时间: 2024-08-15 10:22:31

正宗冒泡排序算法总结的相关文章

冒泡排序算法的JavaScript实现

作为经典的排序算法之一,冒泡排序在JavaScript中也有多种实现方式. 在一些最常见的实现中会声明临时变量,在另一些不必声明临时变量的实现中则可能只支持数值数组或字符串数组(二者之一). 下面介绍两种[无须声明临时变量],[对数值数组和字符串数组都适用]的实现方式. ES5版: var arr = [5, 25, 2, 53, 22, 10]; function bubbleSort(arr) { for (var j = 1, len = arr.length; j < len; j++)

冒泡排序算法

冒泡排序(Bubble Sort)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端. 本文地址:http://www.cnblogs.com/archimedes/p/bubble-sort-algorithm.html,转载请注明源地址. 冒泡排序对n个项目需要O(n2)的比较次数,且可以原地排序.尽

冒泡排序算法可视化

在百度前端技术学院的任务列表那里看到了有一个任务是要求用javascript实现可视化的排序算法,感觉很有趣,就稍微研究了一下,本来是想实现冒泡排序算法和快速排序算法的可视化的,可是快速排序在要如何实现可视化这一步上感觉有一点难度,于是就暂时放弃了. 冒泡排序原理 冒泡排序我们应该都不陌生吧?很简单的两个for循环就可以实现了,其基本原理是:在一开始的时候,比较第一第二个数,如果如果第一个数比第二个数大的话则交换二者位置,在比较第二个和第三个数,同样的如果第二个数比第三个数大的话,则交换二者位置

冒泡排序算法。

   冒泡排序算法 题目: 给定7个int类型的数,用冒泡排序实现出来.  code:   public class Maopaopaixu {    public static  void fun()    {        int arr[] ={9,8,6,1,5,3,2};        System.out.println("数组排序前的顺序为:");        for(int i=0;i<arr.length;i++)        {            Sy

数据结构——排序——冒泡排序算法

冒泡排序(Bubble Sort)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端. 冒泡排序对n个项目需要O(n2)的比较次数,且可以原地排序.尽管这个算法是最简单了解和实作的排序算法之一,但它对于少数元素之外的数列排序是很没有效率的. 冒泡排序是与插入排序拥有相等的执行时间,但是两种法在需要的交换次

javascript学习5-练习之2冒泡排序算法

复习冒泡排序算法,同时自己也写了一个排序算法. 实现效果: 1.自己的算法思想: 数组中数据取第一个为默认最小,依次和后面每个数据比较,只要有比其小的就交换直至找出最小的. 然后将第二个数据与其后面所有数据比较,找出最小,依次重复 2.冒泡排序算法思想: 数据从最低端到最高端为 a[n] ......a[0] 第一轮:将a[0]与a[1]比较,高者上,然后依次比较a[1]和a[2]....a[n-1]和a[n]每次将大的往上冒 第二轮: 将a[0]与a[1]比较,高者上,然后依次比较a[1]和a

【C语言】两种方式实现冒泡排序算法

题目要求 编写一个C语言程序,实现基本的冒泡排序算法. 算法 冒泡排序,用一句话来总结: 一组数中,相邻的两个数进行比较.交换,将最大(小)数交换至尾(首)部,即完成了一次冒泡排序 要想对N个数字进行排序,循环N次即可. 如果真的不理解冒泡排序算法,请点击:冒泡排序_360百科 核心代码 //方式一:从头向尾遍历,将最大数(相对)沉入尾部(相对) void BubbleSort1(int *arr,int sz){ int i = 0; int j = 0; assert(arr); for(i

数据结构之------C++指针冒泡排序算法

C++通过指针实现一位数组的冒泡排序算法. 冒泡排序 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法. 代码: 1 /* 2 Name:冒泡排序算法 3 Copyright:Null 4 Author:小X 5 Date: 06-10-14 10:34 6 Description:C++通过指针实现一维数组的冒泡排序 7 */ 8 9 #include <iostream> 10 11 /* run this program using the console pa

冒泡排序算法总结

冒泡排序算法是思路最简单.最直接的排序方法之一. 每遍历一遍,则将最大(或者最小)的一个数冒泡出来. 预先定义的排序类型.由于只是为了验证排序方法是否正确,所以此处只是简单的对10个元素进行排序检测.如下所示: #define MAXSIZE 10 typedef struct { int r[MAXSIZE+1]; int length; }SqList; void swap(SqList *L,int i,int j) { int temp = L->r[i]; L->r[i] = L-&