1. 程式人生 > >從零開始理解氣泡排序

從零開始理解氣泡排序

氣泡排序是一種基礎的入門級別的演算法,它的效率比較低,但是理解它的好處是讓我們對演算法有初步的瞭解,理解了氣泡排序,不僅僅是讓我們寫出一個簡單演算法,完成入門,筆者認為寫出一段程式除了能夠給我們帶來收入以外,如果你能從寫的程式碼中感受到一絲快樂,這是一種精神享受。下面就讓我們開始理解氣泡排序演算法,然後嘗試著自己去把它寫出來。哪怕過了兩年之後,你仍然能手到拿來,不用過多思考,那麼就算是真正掌握了。

首先,氣泡排序的核心思想是:兩層比較

什麼是兩層比較呢?假設我現在有一個數組

int[] arr = { 56, 39, 85, 66, 34 };

這個陣列顯然是雜亂無章的,我們不管是要將它升序排列還是降序排列,其目的都是讓它成為有序的陣列。

那麼,第一層比較,首先需要確定的就是,要想讓這個陣列有序,我需要比較幾輪(注意不是比較幾次)

氣泡排序的思想是:

每經過一輪比較,我們都要確定一個最值(有可能是最大值,也有可能是最小值),對於上面的陣列,我們經過第一輪比較可以確定85是最大的,但是其它元素我們仍不能確定其大小關係。

然後,在下一輪比較時,前面幾輪的已經確定的最值就不用參與比較了,只需要比較剩餘的元素即可,在上面的陣列中,第二輪比較,顯然不用考慮85了,它已經在第一輪確定為所有數字中最大的一個數字,那麼,我們只需要在56,39,66,34這四個數字中再確定一個最大值,顯然這個值是66.

接著是第三輪比較,此時85和66的位置已經確定了,我們只需要在56,39,34這三個數字中確定一個最大值,顯然,這個值是56,

然後是第四輪比較,此時85,66,56的位置已經確定了,我們只需要在39和34中間選一個最大值,顯然這個值是39.

由於85,66,56,39的位置已經確定,所以最後一個值34的位置也自動確定了(因為只有5個元素,已經佔據了四個位置,那麼剩下的元素只有一個位置可以選擇)。

一句話總結第一層比較:對於有n個元素的陣列,我需要確定n-1個元素的位置,剩下的一個位置自動確定。也就是我們需要進行n-1輪比較,比較的目的是,每一輪產生一個最值。

接下來是第二層比較:即每一輪的比較中,我們需要進行幾次比較(注意,這裡是幾次,而不是幾輪)

很顯然,三個數字,為了確定一個最值,我們需要比較2次,n個數字,我們需要比較n-1次。

根據氣泡排序的特點,每一輪參與比較的元素個數,都會比上一輪少一個,所以,我們每一輪需要進行比較的次數也是遞減的,這個規律是:同樣的,每一輪的比較次數,會比上一輪少一次(因為元素個數少了一個)

做了上面這些準備工作以後,可以寫出氣泡排序的程式碼了(未經優化)

package com.neusoft.baoly;

public class BubbleSort {
	public static void main(String[] args) {
		int[]arr = {6,5,4,3,2,1};
		mySort(arr);
	}
	/*
	 *首先確定氣泡排序演算法一共需要比幾輪
	 *它的思想是每一輪確定一個最大或者最小值
	 *這樣需要比較arr.length-1輪,因為當前面所有數字的順序都確定以後
	 *最後一個數字是不需要排序的
	 *
	 *其次需要確定的是每一輪比較幾次
	 *第一輪還沒有確定最值,也就是說6個數字需要比較5次 5個數字需要比較四次
	 *第二輪開始之前,已經確定一個最值了,如果一共有六個數字那麼第二輪開始時只有5個數字的序列
	 *則第二輪只需要比較四次,第三輪三次,第四輪兩次,第五輪一次,由此確定程式碼
	 *
	 */
	public static void mySort(int []arr){
		for(int i=0;i<arr.length-1;i++){
			for(int j=0;j<arr.length-i-1;j++){
				if(arr[j]>arr[j+1]){
					int temp=arr[j];
					arr[j]=arr[j+1];
					arr[j+1]=temp;
				}
			}
		}
		for (int k = 0; k < arr.length; k++) {
			System.out.print(arr[k]+"\t");
		}
	}
}

希望大家能感受到程式設計的樂趣,獲得成就感 ^-^

轉載請註明出處