首页 > 代码库 > 交换排序算法---冒泡排序与快速排序

交换排序算法---冒泡排序与快速排序

本文介绍两种交换排序方法:冒泡排序、快速排序

冒泡排序

冒泡排序基本思想

每次遍历完序列都把最大(小)的元素放在最前面,然后再对剩下的序列重复前面的一个过程,每次遍历完之后待排序序列就少一个元素,当待排序序列减小为只有一个元素的时候排序就结束了.因此,复杂度在最坏的情况下是O(N ^2).

冒泡排序实现过程

 将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡扫描到违反本原则的轻气泡,就使其向上"飘浮"。

 如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。

 (1)初始

     R[1..n]为无序区。

 (2)第一趟扫描

    从无序区底部向上依次比较相邻的两个气泡的重量,若发现轻者在下、重者在上,则交换二者的位置。即依次比较(R[n],R[n-1]),(R[n-1],R[n-2]),…,(R[2],R[1]);

    对于每对气泡(R[j+1],R[j]),若R[j+1].key<R[j].key,则交换R[j+1]和R[j]的内容。

       第一趟扫描完毕时,"最轻"的气泡就飘浮到该区间的顶部,即关键字最小的记录被放在最高位置R[1]上。

 (3)第二趟扫描

     扫描R[2..n]。扫描完毕时,"次轻"的气泡飘浮到R[2]的位置上……

     最后,经过n-1 趟扫描可得到有序区R[1..n]

注意:  1.第i趟扫描时,R[1..i-1]和R[i..n]分别为当前的有序区和无序区;

       2.扫描仍是从无序区底部向上直至该区顶部;

       3.扫描完毕时,该区中最轻气泡飘浮到顶部位置R[i]上,结果是R[1..i]变为新的有序区。

举例说明"冒泡排序的排序过程"

待排序的记录数组(23,34,5,7,56),设想待排序数组垂直竖立。

待排序数组(6,8,5,7,4)完整的排序过程

更多"冒泡排序测试",到《冒泡排序动画演示》

下面是Java实现代码

public class SortSolution {    static int count = 0;    /**      * 改进后的冒泡排序算法的实现:      * @param list 欲排序的数组      * @author tony      */      public static void improvedBubbleSort(int[] list) {          boolean needNextPass = true;          for(int i = 0; i < list.length && needNextPass; ++i) {             needNextPass = false;            for(int j = list.length-1; j > i; --j) {                  if(list[j] < list[j-1]) {                         int temp = list[j];                         list[j] = list[j-1];                         list[j-1] = temp;                       needNextPass = true;                       count++;                }              }             //内层循环判断出有序后,便不再进行循环              if (!needNextPass) return;            System.out.print("" + (i + 1) + "次排序结果:");            for (int k = 0; k < list.length; k++) {                System.out.print(list[k] + "\t");            }            System.out.println("");        }         System.out.print("最终排序结果:");        for (int l = 0; l < list.length; l++) {            System.out.print(list[l] + "\t");        }    }      public static void main(String[] args) {        int[] array = new int[6];          for (int k = 0; k < array.length; k++) {              array[k] = (int) (Math.random() * 100);          }        System.out.print("排序之前结果为:");        for (int i = 0; i < array.length; i++) {            System.out.print(array[i] + "\t");        }        System.out.println("");        runBubbleSort(array);        System.out.println("交换次数:"+count);    }        }

 

交换排序算法---冒泡排序与快速排序