经典排序算法之冒泡排序算法

来源:互联网 发布:java路径分隔符 编辑:程序博客网 时间:2024/05/16 05:29

1、概念:

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。维基百科:冒泡排序
它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

2、算法原理

冒泡排序算法的运作如下:
  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

3、算法思路

要排序,就要比较。所以是基于对两个数进行比较进行,关键之处是如何进行比较。排序肯定是对一个序列的数进行重新排列,而这一序列数每个数都占了一个位置,所以我们可以把排序当成位置的调整。
就好比学校里我们排队做早操的道理一样,从第队头开始,依次进行比较,谁高谁就往后靠,谁找到最高的人,把最高的人排到最后。此时,最高的人到了最后。那么这时候就要找到第二高的人,把他放到倒数第二个位置。以此,设有n个人,那么要进行n次这样的过程。(仔细想想是不是感觉很简单了)从高到底排序道理是一样的。

4、实例分析及代码

问题:设有一数组,其大小为10个元素(int   str[10])数组内的数据是无序。现在要求我们通过编程将这个无序的数组变成一个从大到小的排序的数组(从下标为0开始)

思路:按照题目的要求,毫无疑问,正确的结果应该就像这样:10,9,8,7,6,5,4,3,2,1,0  要做到这样,最简单和最直接想到的方法就是进行对比交换。

代码:

package com.zgb.algoritm.sort;/** *  * @author Mr.Zhang * */public class BubbleSort {public static void main(String[] args) {int array[] = new int[] { 10,9,8,7,6,5,4,3,2,1,0 };bubblesort(array);}public static void bubblesort(int array[]) {int temp = 0;for (int i = 0; i < array.length - 1; i++) {  // 有n个数,就要比较n-1次for (int j = 0; j < array.length - 1 - i; j++) {  //每次找一个最大的数,那么第i次只需比较array.length - 1 - i次if (array[j] > array[j + 1]) {  //比较//交换位置temp = array[j];array[j] = array[j + 1];array[j + 1] = temp;}}}for (int i = 0; i < array.length; i++) {System.out.printf("%5d", array[i]);}}}

  • 首先,把10个数里最大的个数放到下标为10的位置上(str[10])(如何实现,看下步骤,这句话是思路)
  • 通过将下标为0的数(str[0])与剩下其余9个数进行对比交换(将较少者放置在下标为0的位置上),就可以得到这10个数最大的那个
  • 10个数最大的那位确定后,接下来就要找剩下9个数最大的那个。
  • 因为已经确定出一个最小的数,所以就不要动str[0],直接从str[1]开始,与剩下的8个数对比交换,找出9个数中最大的那位放到下标为9(str[9])的位置上
  • 继续按照这个思路就可以将这十个数变成有序的(从大到小)的数组

5 、时间复杂度  

      最好情况下:正序有序,则只需要比较n次。故,为O(n)  
      最坏情况下:  逆序有序,则需要比较(n-1)+(n-2)+……+1,故,为O(N*N)
1 0