包含
- 快速排序
- 归并排序
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] + " ");
}
}
}
陆续更新中