「第8節」算法的基礎知識(二)

大家好,上一節,我對算法的定義、分類、特點等方面進行了深入細緻地講解、分析。這一節,我們繼續學習算法。我將根據上一節的分類,以實例為抓手,對
冒泡排序、二分查找這2種重要算法設計技術進行仔細講解,以讓大家對算法有個深入的瞭解。

「第8節」算法的基礎知識(二)

「第8節」算法的基礎知識(二)

(1)冒泡排序

定義:冒泡排序算法屬於排序算法中的一種,是一種非常常見、非常實用的算法技術。

冒泡排序的基本理念是:反覆遍歷需要排序的數組。在每次遍歷過程中,比較相鄰的2個數,如果這2個數是按照降序的順序排列的,就交換它們的順序;如果這2個數是按照升序的順序排列的,則保持不變。遍歷的次數是不固定的,直到沒有數需要交換時遍歷結束,這時所有的數都按照從小到大排列了。由於此時較小的數像“氣泡”一樣逐漸“浮向”頂部,較大的數“沉到”底部,所以這種算法就被稱為冒泡排序法。

「第8節」算法的基礎知識(二)

用通俗語言,可以將該算法步驟描述如下:

第一步:比較第1個數和第2個數,如果前者比後者大,就交換它們的位置;否則,不變。

第二步:同第一步,對每一對相鄰的數進行大小比較,直到最後一對數。

第三步:除了最後1個數,又從第1個數開始,重複第一步和第二步工作。

第四步:直到所有的數都沒有交換的情況發生時,說明所有的數都從小到大排列了,則排序結束。

範例1:

public class BubbleSort {

public static void bubbleSort(int[] list){

boolean needNextPass= true;

for(int k=1;k<list.length&&needNextPass;k++){

needNextPass= false;

for(int i=0;i<list.length-k;i++){

if(list[i] >list[i+1]){

int temp=list[i];

list[i]=list[i+1];

list[i+1]=temp;

needNextPass= true;

}

}

}

}

public static void main(String[] args) {

int[] list= {2,3,2,5,7,1,-8,19,6,10};

bubbleSort(list);

for(int i=0;i<list.length;i++)

System.out.print(list[i]+ 〝 〞);

}

}

「第8節」算法的基礎知識(二)

範例1在eclipse中的結果顯示

範例講解:該程序新建了一個bubbleSort()方法,調用這個方法需要調入list這個數組類型的參數。

首先,在主程序裡面給list賦好值。

接著,調用bubbleSort()方法。先將boolean類型的數needNextPass賦初始值為true。

然後,是一個for循環(有關for循環將在以後章節深入講解),for循環裡面又嵌套一個for循環。通過這2個for循環,將數組中元素從小到大排列!

嵌套裡面的for循環每一次運行結束,都會將數組中最大的元素移動到最右邊。這樣直到needNextPass為false(即沒有元素交換的情況發生了)以及k>=list.length(即k值比list這個數組最大下標值都大了)時,2個for循環才結束。

最後,在主程序裡面,又使用一個for循環將排好序的數組list打印顯示出來。

(2)二分查找算法

定義:二分查找算法是查找算法當中的一種,是種非常重要的算法思想。它在一種在有序數組中查找某一特定元素的搜索算法。使用二分查找算法的前提條件是:數組中的元素事先已經排好序了(而且一般是遞增)。

二分查找算法的基本理念是:從數組的中間元素開始搜索,如果中間元素剛好是要查找的元素(以下稱為關鍵字),則搜素過程結束;如果關鍵字小於中間元素,就在數組的前一半元素中繼續搜索,而且和開始一樣從中間元素開始比較;如果關鍵字大於中間元素,就在數組的後一半元素中繼續搜索,而且和開始一樣從中間元素開始比較。

「第8節」算法的基礎知識(二)

二分查找算法直到查找到所需的關鍵字即終止。它的每一次比較都使搜索範圍縮小一半,相對於線性查找算法而言,它的效率要高出許多!

用通俗語言,可以將該算法步驟描述如下:

第一步:設低下標low初值為0,設高下標high初值為list.length-1(list.length為數組長度),中間元素下標為mid。

第二步:將關鍵字與數組中間元素進行比較,如果關鍵字等於中間元素,返回下標mid,結束搜索;如果關鍵字大於中間元素,就通過low=mid+1將mid+1的值賦給低下標,並從數組後一半元素中繼續搜索;如果關鍵字小於中間元素,就通過high=mid-1將mid-1的值賦給高下標,並從數組前一半元素中繼續搜索。

第三步:直到搜索到所需的關鍵字,二分查找的循環才結束,否則反覆進行第二步工作,直至high

範例2:

public class BinarySearch {

public static int binarySearch(int[] list,int key) {

int low=0;

int high=list.length-1;

while(high>=low) {

int mid=(low+high)/2;

if(key<list>

high=mid-1;

else if(key==list[mid])

return mid;

else

low=mid+1;

}

return -1;

}

public static void main(String[] args) {

int[] list= {2,3,5,11,16,19,23,42,48};

int key=23;

System.out.print(binarySearch(list,key));

}

}

「第8節」算法的基礎知識(二)

範例2在eclipse中的結果顯示

範例講解:該程序新建了一個binarySearch()方法,調用這個方法需要調入list這個數組以及key這個數據2個參數。

首先,在主程序裡面將list和key賦好初始值。

接著調用binarySearch()方法。在這個方法裡面,給低下標low和高下標high賦好初始值。

然後,是一個while循環程序(有關while循環將在以後章節深入講解)。這個循環程序直至high

在while循環程序裡面,先將mid初值設為(low+high)/2。然後,當關鍵字key與數組中間元素list[mid]做比較。如果key等於list[mid],直接返回mid值,這時無論high;如果key大於list[mid],將mid+1賦值給low;如果key小於list[mid],將mid-1賦值給high。如果整個循環結束都沒有找到關鍵字,就返回值-1。

最後,當有return值時,就在主程序中通過print()方法打印顯示出來。

本節最後,還是給大家留一個編程小作業,大家要好好思考:

編寫一個程序,首先從控制檯輸入10個double類型的數,再用冒泡排序的方法,將這10個數排好序,並打印顯示出來。

/<list>


分享到:


相關文章: