java中常見排序演算法
阿新 • • 發佈:2022-03-29
1 氣泡排序
排序思路:兩兩交換,大的放後面,小的放前面
程式碼實現
public static void maopao(int[] arr) {
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length-i-1; j++) {
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));
}
2 選擇排序
排序思路:每次迴圈找出最大值(最小)放在陣列末尾。
程式碼實現
public static void selectSort(int[] arr) {
for (int i = 0; i < arr.length-1; i++) {
for (int j = i+1; j < arr.length; j++) {
if (arr[i] > arr[j]) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
}
3 插入排序
排序思路:將一個元素插入到已有序的陣列中,在初始時未知是否存在有序的資料,因此將元素第一個元素看成是有序的。與有序的陣列進行比較,比它大則直接放入,比它小則移動陣列元素的位置,找到個合適的位置插入。當只有一個數時,則不需要插入了,因此需要n-1
趟排序
程式碼實現:
public static void insertSort(int[] arr) {
//臨時變數
int temp;
//外層迴圈控制需要排序的趟數(從1開始因為將第0位看成了有序資料)
for (int i = 1; i < arr.length; i++) {
temp = arr[i];
//如果前一位(已排序的資料)比當前資料要大,那麼就進入迴圈比較[參考第二趟排序]
int j = i - 1;
while (j >= 0 && arr[j] > temp) {
//往後退一個位置,讓當前資料與之前前位進行比較
arr[j + 1] = arr[j];
//不斷往前,直到退出迴圈
j--;
}
//退出了迴圈說明找到了合適的位置了,將當前資料插入合適的位置中
arr[j + 1] = temp;
}
System.out.println(Arrays.toString(arr));
}
4 快速排序
排序思路:在陣列中找一個元素(節點),比它小的放在節點的左邊,比它大的放在節點右邊。一趟下來,比節點小的在左邊,比節點大的在右邊。不斷執行這個操作….
程式碼實現:
/** * 快速排序 * @param arr * @param L 指向陣列第一個元素 * @param R 指向陣列最後一個元素 */ public static void quickSort(int[] arr, int L, int R) { int i = L; int j = R; //支點 int pivot = arr[(L + R) / 2]; //左右兩端進行掃描,只要兩端還沒有交替,就一直掃描 while (i <= j) { //尋找直到比支點大的數 while (pivot > arr[i]) i++; //尋找直到比支點小的數 while (pivot < arr[j]) j--; //此時已經分別找到了比支點小的數(右邊)、比支點大的數(左邊),它們進行交換 if (i <= j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; i++; j--; } } //上面一個while保證了第一趟排序支點的左邊比支點小,支點的右邊比支點大了。 //“左邊”再做排序,直到左邊剩下一個數(遞迴出口) if (L < j){ quickSort(arr, L, j); } //“右邊”再做排序,直到右邊剩下一個數(遞迴出口) if (i < R){ quickSort(arr, i, R); } System.out.println(Arrays.toString(arr)); }