Java中陣列的氣泡排序,氣泡排序優化
阿新 • • 發佈:2018-11-30
氣泡排序:
思路: int[] arr={3,4,2,6,1}; 1.第一次排序,從索引[0]開始,依次兩兩比較。索引[0]與[1]比,[1]與[2]比,[2]與[3]比…… if(arr[0]<arr[1]){ 元素的位置不變; } if(arr[1]>arr[2]){ //交換位置 int temp=arr[1]; arr[1]=arr[2]; arr[2]=arr[temp]; } 如長度為n(5)的陣列arr ,第一次排序,共比較n-1(4)次;排序後為{3,2,4,1,6},此時陣列的最後 一個元素為陣列的最大值; 2.第二次排序(假設共需排序i次,此時索引[i]=1): 依次類推,此時元素的最大值已經確定,也就是陣列的最後兩個元素不用比較了。排序後的陣列 為{2,3,1,4,6},共比較了n-1-i(3)次 ......
程式碼:
public static void main(String[] args) {
int[] arr={3,4,2,6,1};
System.out.println("當前陣列:"+ Arrays.toString(arr));
for (int i = 0; i < arr.length-1; i++) { //最外層,共需排序n-1次
for (int j = 0; j <arr.length-1-i; j++) {//內層,第i次排序需排序n-i-i次
if (arr[j]>arr[j+1]) {
//交換位置
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
System.out.println("排序後:"+ Arrays.toString(arr));
}
氣泡排序優點:
氣泡排序的優點:每進行一趟排序,就會少比較一次,因為每進行一趟排 序都會找出一個較大值。 每一趟少比較一次,一定程度上減少了演算法的量。 時間複雜度為:O(n²) tip:這個我是直接記得,不整為什麼了
氣泡排序法存在的不足及改進方法:
第一,在排序過程中,執行完最後的排序後,雖然資料已全部排序完備,但程式無法判斷是否完成排
序,為了解決這一不足,可設定一個標誌位flag,將其初始值設定為非0,表示被排序的表是一個
無序的表,每一次排序開始前設定flag值為0,在進行資料交換時,修改flag為非0。在新一輪排序
開始時,檢查此標誌,若此標誌為0,表示上一次沒有做過交換資料,則結束排序;否則進行排序
此段轉自https://www.cnblogs.com/xiaoming0601/p/5866048.html 他那的冒泡優化有點小問題0.0
氣泡排序優化
int[] arr={3,4,5,6,7};
System.out.println("當前陣列:"+ Arrays.toString(arr));
boolean flag=false; //新增的程式碼,用flag標記,也可以新增一個計數器
for (int i = 0; i < arr.length-1; i++) { //最外層,共需排序n-1次
for (int j = 0; j <arr.length-1-i; j++) {//內層,第i次排序需排序n-i-1次
if(arr[j]>arr[j+1]) {
//交換位置
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag=true;
}
}
//新增的程式碼
if(!flag){
break;//如果陣列沒有生改變,flag則仍為為false,此時執行這段程式碼,跳出迴圈
}
}
System.out.println("排序後:"+ Arrays.toString(arr));
-----------------------------------------------------我是分割線----------------------------------------------------------------
插入排序和選擇排序也重新整一片吧