package sort;
import java.util.Arrays;
public class Sort {
public static void main(String[] args) {
int[] arr = {8, 6, 4, 2, 1, 3, 5, 7, 9};
System.out.println(Arrays.toString(arr));
// Choice(arr);
// Bubble(arr);
// Insert(arr);
// Quick(arr, 0, arr.length - 1);
// Merge(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
}
/* 归并排序 */
private static void Merge(int[] arr, int start, int stop) {
/* 开始和结束遇到则跳出 */
if (start == stop) return;
int middle = (start + stop) / 2;
/* 左递归 */
Merge(arr, start, middle);
/* 有递归 */
Merge(arr, middle + 1, stop);
/* 合并 */
_Merge(arr, start, middle, stop);
}
private static void _Merge(int[] arr, int start, int middle, int stop) {
/* 临时数组存放 */
int[] tmp = new int[stop - start + 1];
int i = start, j = middle + 1, k = 0;
/* 两段比较小的先放大的后放 */
while (i <= middle && j <= stop) {
if (arr[i] < arr[j]) tmp[k++] = arr[i++];
else tmp[k++] = arr[j++];
}
/* 剩余直接放入 */
while (j <= stop) tmp[k++] = arr[j++];
while (i <= middle) tmp[k++] = arr[i++];
/* 拷贝回去 */
for (k = 0; k < tmp.length; k++) arr[start + k] = tmp[k];
}
/* 快速排序 */
private static void Quick(int[] arr, int left, int right) {
/* 左边大于右边则跳出 */
if (left > right) return;
/* 假定左边是中轴 */
int start = left, stop = right, pivot = arr[left];
while (start < stop) {
/* 从右边开始找比标中轴的小的 */
while (start < stop && arr[stop] >= pivot) stop--;
/* 找到后放入中轴 */
arr[start] = arr[stop];
/* 在从左边找大于中轴的 */
while (start < stop && arr[start] < pivot) start++;
/* 找到后放入右边 */
arr[stop] = arr[start];
}
/* 最后这个位置就是中轴的位置,放入即可 */
arr[start] = pivot;
Quick(arr, left, start - 1);
Quick(arr, start + 1, right);
}
/* 插入排序 */
private static void Insert(int[] arr) {
/* 第一个默认有序 */
for (int i = 1; i < arr.length; i++) {
int tmp = arr[i];
/* 只要前一个大后往后移 */
while ((i - 1) >= 0 && arr[i - 1] > tmp) {
arr[i] = arr[i - 1];
i--;
}
/* 直到合适位置插入 */
arr[i] = tmp;
}
}
/* 冒泡排序 */
public static void Bubble(int[] arr) {
/* 最后一次不需要比较所以减一 */
for (int i = 0; i < arr.length - 1; i++) {
/* 每次取出后一个跟前一个进行比较 */
for (int j = 0; j < arr.length - 1 - i; j++) {
/* 小的往前放,大的往后放 */
if (arr[j + 1] < arr[j]) {
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
/* 选择排序 */
public static void Choice(int[] arr) {
/* 最后一次不需要比较所以减一 */
for (int i = 0; i < arr.length - 1; i++) {
/* 设置最小索引 */
int k = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[k]) {
/* 找到最小索引 */
k = j;
}
}
/* 交换 */
int tmp = arr[i];
arr[i] = arr[k];
arr[k] = tmp;
}
}
}