大家好,上一節,我對算法的定義、分類、特點等方面進行了深入細緻地講解、分析。這一節,我們繼續學習算法。我將根據上一節的分類,以實例為抓手,對 冒泡排序、二分查找這2種重要算法設計技術進行仔細講解,以讓大家對算法有個深入的瞭解。
(1)冒泡排序
定義:冒泡排序算法屬於排序算法中的一種,是一種非常常見、非常實用的算法技術。
冒泡排序的基本理念是:反覆遍歷需要排序的數組。在每次遍歷過程中,比較相鄰的2個數,如果這2個數是按照降序的順序排列的,就交換它們的順序;如果這2個數是按照升序的順序排列的,則保持不變。遍歷的次數是不固定的,直到沒有數需要交換時遍歷結束,這時所有的數都按照從小到大排列了。由於此時較小的數像“氣泡”一樣逐漸“浮向”頂部,較大的數“沉到”底部,所以這種算法就被稱為冒泡排序法。
用通俗語言,可以將該算法步驟描述如下:
第一步:比較第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]+ 〝 〞);
}
}
範例講解:該程序新建了一個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)二分查找算法
定義:二分查找算法是查找算法當中的一種,是種非常重要的算法思想。它在一種在有序數組中查找某一特定元素的搜索算法。使用二分查找算法的前提條件是:數組中的元素事先已經排好序了(而且一般是遞增)。
二分查找算法的基本理念是:從數組的中間元素開始搜索,如果中間元素剛好是要查找的元素(以下稱為關鍵字),則搜素過程結束;如果關鍵字小於中間元素,就在數組的前一半元素中繼續搜索,而且和開始一樣從中間元素開始比較;如果關鍵字大於中間元素,就在數組的後一半元素中繼續搜索,而且和開始一樣從中間元素開始比較。
二分查找算法直到查找到所需的關鍵字即終止。它的每一次比較都使搜索範圍縮小一半,相對於線性查找算法而言,它的效率要高出許多!
用通俗語言,可以將該算法步驟描述如下:
第一步:設低下標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));
}
}
範例講解:該程序新建了一個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
最後,當有return值時,就在主程序中通過print()方法打印顯示出來。
本節最後,還是給大家留一個編程小作業,大家要好好思考:
編寫一個程序,首先從控制檯輸入10個double類型的數,再用冒泡排序的方法,將這10個數排好序,並打印顯示出來。
/<list>閱讀更多 計算機編程的全部事兒 的文章