氣泡排序(筆試題)
-
兩次迴圈,外層冒泡輪數,裡層依次比較
-
時間複雜度為O(n2)
-
過程:
- 比較陣列中兩個相鄰的元素,如果第一個元素比第二個大,則交換它們的位置
- 每一次比較都會產生一個最大或者最小的陣列,下一輪則可以少一個排序
- 依次迴圈,直到結束
public class BubbleSort {
public static void main(String[] args) {
//氣泡排序(升序:從小到大)
int[] nums = {2,4,1,3,5,9,6,7};
int temp = 0;//臨時變數,用於交換
//輸出排序前陣列
System.out.println("排序前陣列為:");
for (int i = 0; i < nums.length; i++) {
System.out.print(nums[i]+" ");
}
//兩兩比較
for (int i = 0; i < nums.length-1; i++) {
for (int j = 0; j < nums.length-1; j++) {
if(nums[j+1]<nums[j]){
//將比較小的數換到前面
temp = nums[j];
nums[j] = nums[j+1];
nums[j+1] = temp;
}
}
}
//輸出排序後陣列
System.out.println();//換行
System.out.println("排序後陣列為:");
for (int i = 0; i < nums.length; i++) {
System.out.print(nums[i]+" ");
}
}
}
執行結果為:
編寫一個氣泡排序的方法
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) {
int[] nums = {2,4,1,3,5,9,6,7};
int[] nums_2 = bubSort(nums);//呼叫方法
//輸出排序後陣列
System.out.println("排序後陣列為:");
System.out.println(Arrays.toString(nums_2));
}
//氣泡排序的方法(升序)
public static int[] bubSort(int[] arr){
int temp = 0;
//兩兩比較
for (int i = 0; i < arr.length-1; i++) {
for (int j = 0; j < arr.length-1; j++) {
if(arr[j+1]<arr[j]){
//將比較小的數換到前面
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
return arr;
}
}
最佳化
減少比較次數
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) {
int[] nums = {2,4,1,3,5,9,6,7};
int[] nums_2 = bubSort(nums);
//輸出排序後陣列
System.out.println("排序後陣列為:");
System.out.println(Arrays.toString(nums_2));
}
//氣泡排序的方法(升序)
public static int[] bubSort(int[] arr){
int temp = 0;
//兩兩比較
for (int i = 0; i < arr.length-1; i++) {
boolean flag = false;//用於標記是否發生了交換
for (int j = 0; j < arr.length-1; j++) {
if(arr[j+1]<arr[j]){
//將比較小的數換到前面
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
flag = true;
}
}
if(flag == false){
//如果沒有發生交換則表示已經排序完成,不需要再繼續迴圈比較
break;
}
}
return arr;
}
}