包含
- 快速排序
- 歸併排序
package sort;
public class SortAlgorithm {
/*
快速排序
*/
public void quickSort(int[] arr, int low, int high){
if(low >= high) return ; // 數組只剩一個元素,不用再排序;
// 每次排序設置一個基準點,低於基準點的數放在基準點右邊,高於基準點的數放在基準點左邊;
int flag = arr[low]; // 基準元素
int i = low; // 右邊哨兵的位置
int j = high; // 左邊哨兵位置;
while(i < j){
while (flag <= arr[j] && i < j){ //從後往前找
j--;
}
while (flag >= arr[i] && i < j){
i++;
}
if(i < j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
arr[low] = arr[j];
arr[j] = flag;
quickSort(arr, low, j-1); // 遞歸的排序基準點右邊的子數組;
quickSort(arr, j+1, high);
}
/*
快速選擇
*/
public void quickSelected(int[] arr, int low, int high){
}
/*
歸併排序
*/
// 1)合併兩個排序的數組
public void merge(int [] arr, int low, int high, int mid, int[] temp){
if(low >= high) return ;
int i = low;
int j = mid+1;
int p = low;
// 合 ---- 記錄左右兩邊的位置。
while(i <= mid && j <= high){
if(i <= mid && arr[i] <= arr[j]){
temp[p++] = arr[i++];
}else{
temp[p++] = arr[j++];
}
}
while(i <= mid){
temp[p++] = arr[i++];
}
while (j <= high){
temp[p++] = arr[j++];
}
// 將temp中合併的結果拷貝到arr中
p = low;
while(low <= high){
arr[low++] = temp[p++];
}
}
// 2)分 -- 拆分爲左右兩個區間
public void merge_sort(int[] arr, int low, int high, int[] temp){
if(low < high){
int mid = (low + high) / 2;
merge_sort(arr, low, mid, temp);
merge_sort(arr, mid+1, high, temp);
merge(arr, low, high, mid, temp);
}
}
// 提供·統一調用歸併的函數。
public void mergeSort(int[] arr){
int[] temp = new int[arr.length];
merge_sort(arr, 0, arr.length-1, temp);
}
}
測試:
package sort;
public class SortTest {
public static void main(String[] args) {
int[] arr = {1, 4, 2, 100, 4, 8 ,32, 11};
SortAlgorithm t1 = new SortAlgorithm();
// 快排
// t1.quickSort(arr, 0, arr.length-1);
//歸併
t1.mergeSort(arr);
for(int i = 0; i < arr.length; i++){
System.out.print(arr[i] + " ");
}
}
}
陸續更新中