1. 程式人生 > 其它 >氣泡排序的優化演算法

氣泡排序的優化演算法

其實,我們可以把之前的氣泡排序的演算法優化一下,基於氣泡排序的以下特點:

1.整個數列分成兩部分:前面是無序數列,後面是有序數列。

2.初始狀態下,整個數列都是無序的,有序數列是空。

3.每一趟迴圈可以讓無序數列中最大數排到最後,(也就是說有序數列的元素個數增加1),也就是不用再去顧及有序序列。

4.每一趟迴圈都從數列的第一個元素開始進行比較,依次比較相鄰的兩個元素,比較到無序數列的末尾即可(而不是數列的末尾);如果前一個大於後一個,交換。

5.判斷每一趟是否發生了陣列元素的交換,如果沒有發生,則說明此時陣列已經有序,無需再進行後續趟數的比較了。此時可以中止比較。

【示例7-21】氣泡排序的優化演算法

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 importjava.util.Arrays; publicclassTest1{ publicstaticvoidmain(String[]args){ int[]values={3,1,6,2,9,0,7,4,5,8}; bubbleSort(values); System.out.println(Arrays.toString(values)); } publicstaticvoidbubbleSort(int
[]values){ inttemp; inti; //外層迴圈:n個元素排序,則至多需要n-1趟迴圈 for(i=0;i<values.length-1;i++){ //定義一個布林型別的變數,標記陣列是否已達到有序狀態 booleanflag=true; /*內層迴圈:每一趟迴圈都從數列的前兩個元素開始進行比較,比較到無序陣列的最後*/ for(intj=0;j<values.length-1-i;j++){ //如果前一個元素大於後一個元素,則交換兩元素的值; if(values[j]>values[j+1]){ temp=values[j]; values[j]=values[j+1];
values[j+1]=temp; //本趟發生了交換,表明該陣列在本趟處於無序狀態,需要繼續比較; flag=false; } } //根據標記量的值判斷陣列是否有序,如果有序,則退出;無序,則繼續迴圈。 if(flag){ break; } } } }

執行結果如圖7-15所示:

圖7-15 示例7-21執行效果圖