Java排序总结(选择|冒泡|插入|快速|归并)

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;
		}
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值