氣泡排序的優化演算法
阿新 • • 發佈:2021-09-20
其實,我們可以把之前的氣泡排序的演算法優化一下,基於氣泡排序的以下特點:
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 |
import java.util.Arrays;
public class Test1{
public static void main(String[]args){
int []values={ 3 , 1 , 6 , 2 , 9 , 0 , 7 , 4 , 5 , 8 };
bubbleSort(values);
System.out.println(Arrays.toString(values));
}
public static void bubbleSort( int []values){
int temp;
int i;
//外層迴圈:n個元素排序,則至多需要n-1趟迴圈
for (i= 0 ;i<values.length- 1 ;i++){
//定義一個布林型別的變數,標記陣列是否已達到有序狀態
boolean flag= true ;
/*內層迴圈:每一趟迴圈都從數列的前兩個元素開始進行比較,比較到無序陣列的最後*/
for ( int j= 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執行效果圖