我也来聊一下冒泡排序

有一个数组 :

int array [] = {5,4,3,2,1};

现在要求从小到大进行排序,那么我们可以想象排序过后 应该是 {1,2,3,4,5}

那么 冒泡排序 的原理就是 :

每比较一轮,就把最大的放到最后面,这也是冒泡名称的由来。

那么我们先做第一轮比较吧!

for (int i = 0; i < a.length - 1; i++){
    if(a[ i ] > [a + i]){ //如果a[i] 比 a[i+1]大的话,二者就交换顺序
        int temp = a[ i + 1];
        a[i + 1] = a[ i ];
        a[ i ] = temp;
    }
}    

来细分一下 这个比较的过程 :

i = 0 ,a[0] 和 a[1]比较,完成后数组的顺序应该是 :

4,5,3,2,1

i = 1 ,a[1] 和 a[2]比较,比较完以后,数组的顺序应该是 :

4,3,5,2,1

i = 2, a[2] 和 a[3]比较,比较完以后,数组的顺序应该是:

4,3,2,5,1

i = 3, a[3] 和 a[4]比较,比较完以后,数组的顺序应该是:

4,3,2,1,5

当i=4的时候,由于要判断 i<a.length - 1,不满足,故退出比较。

所以第一轮比较完以后,数组的顺序应该是 {4,3,2,1,5}.

此时对比结果,还需要比较,那么到底需要比较几轮呢?几轮呢?轮呢?呢~~~~??

如果 “每次把最大的数字冒到最后去” 算一轮的话,那么在最极端情况下[比如本例],那么应该是n-1轮,那么又有同学问了,为什么是n-1轮呢?

那再举个例子,2个数字 {2,1}比较的话,把大的放后面去要几轮呢?1轮,也就是 2 - 1 轮,呵呵,推广一下就是 n - 1轮了。

所以 冒泡的代码应该是这个样子的 :

1 for(int j = 0 ; j < a.length - 1; j++){ // a.length - 1 标示 n - 1轮
2     for (int i = 0; i < a.length - 1; i++){
3      if(a[ i ] > [a + i]){ //如果a[i] 比 a[i+1]大的话,二者就交换顺序
4          int temp = a[ i + 1];
5          a[i + 1] = a[ i ];
6          a[ i ] = temp;
7      }
8   }
9 }

到这里冒泡其实已经结束了。

但是其实还有一个优化空间。。。

我们前面已经发现,

经过第一轮排序,最大的一个已经到最后一个位置了。。

经过第二轮排序,次大的一个已经到倒数第二个位置了。。

以此类推,所以每经过一轮排序,那么“对应的倒数位置”的数字其实已经不用对比了。。。

比如 经过第一轮排序,那么在进行第二轮排序的时候,倒数第一个其实已经不用对比了,因为再第一轮排序的时候,已经非常明确,最后一个就是最大的了。。

素以这里就有一个优化的地方 :

 for(int j = 0 ; j < a.length - 1; j++){ // a.length - 1 标示 n - 1轮
     for (int i = 0; i < a.length - 1 - j; i++){//这里减去一个 " j" ,那么每次比较 “对应的倒数位置”的数字就不会对比了
      if(a[ i ] > [a + i]){ //如果a[i] 比 a[i+1]大的话,二者就交换顺序
          int temp = a[ i + 1];
          a[i + 1] = a[ i ];
          a[ i ] = temp;
      }
   }
 }

到这里冒泡应该比较完整了,那么自己写的代码自己肯定要测试的啦。。

那么怎么测试呢 ?

我来写几个用例吧 ,直接写数组元素吧 :

a [] = {};

a [] = {-1,-2,0,2,1}

a [] = {10,9,8,7,6,5,4,3,2,1}

a [] = {1,2,3,4,5,6,7,8,9,10}

面试经常被问到。。而且因为这个错过了几个很好的机会。希望以后不会再因为这个被刷了,呵呵,2015,好运常来~

时间: 2024-10-06 05:42:43

我也来聊一下冒泡排序的相关文章

经典排序算法 - 冒泡排序Bubble sort

 原文出自于 http://www.cnblogs.com/kkun/archive/2011/11/23/bubble_sort.html 经典排序算法 - 冒泡排序Bubble sort 原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子 例子为从小到大排序, 原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 | 第一趟排序(外循环) 第

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

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

php实现冒泡排序

一个程序应包括:对数据的描述:在程序中要指定数据的类型和数据的组织形式,即数据结构(data structure).对操作的描述:即操作步骤,也就是算法(algorithm).Nikiklaus Wirth提出的公式:程序=数据结构+算法作为一个程序员必须得懂点算法啊,就从最简单的开始吧=>冒泡排序 维基百科的说法 冒泡排序(英语:Bubble Sort,台湾另外一种译名为:泡沫排序)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列

算法之冒泡排序(Java示例)

冒泡排序(英语:Bubble Sort) 是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端. 动画示意 实现示例 Java 1 public class BubbleSortExample { 2 3 static void bubbleSort(int[] arr){ 4 int len =

python 算法中的--冒泡排序

#列表每两个相邻的数,如果前面的比后面的大,那么就交换这两个数# shuffle() 方法将序列的所有元素随机排序. import random def bubble_sort(li): for i in range(len(li)-1): #i代表趟 for j in range(len(li)-i-1): #j列表 if li[j]>li[j+1]: li[j],li[j+1]=li[j+1],li[j] data=list(range(5)) random.shuffle(data) #打

【2017-02-28】冒泡排序

冒泡排序就是比大小,若前者大于后者,则两者交换位置.用两个For循环嵌套来实现 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 数组 { class Program { static void Main(string[] args) { //冒泡排序 3 5 1 2 4 (12345) //思路:第一个for循环执行第一次的时候把第一个数拿出来和后面的数

C语言之冒泡排序算法

一.什么是冒泡排序?冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越大的元素会经由交换慢慢"浮"到数列的顶端,故名.二.冒泡排序的原理   冒泡排序原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,然后再从头

冒泡排序总结

package Test5; public class maoPai { public static void main(String[] args) { int a[]={56,23,78,1,0,9,46,20}; maoPai.paiXu(a); for(int i=0;i<a.length;i++){ System.out.print(a[i]+" "); } } public static void paiXu(int a[]){ boolean t=true;A冒泡排

利用冒泡排序实现一串字符串从小到大的排序

实现B/S架构,输入一串字母或数字,将它们按从小到大排序,排序算法在服务端实现. 以下是实现: Test.java import java.io.IOException;import java.io.PrintWriter; import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.ser