排序算法

1

public class SortTest {

	public static int test1[] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };

	public static int test2[] = { 3, 1, 6, 4, 5, 2 };

	public static int test3[] = { 57, 68, 59, 52, 72, 28, 96, 33, 24, 19 };

	public static void main(final String[] args) {
		// bubbleSort(test2);
		// selectSort(test2);
		quickSort(test3);
	}

	/**
	 * 冒泡排序算法(升序)的运作如下:
	 * 比较【相邻】的元素。如果第一个比第二个大,就交换他们两个。
	 * 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
	 * 针对所有的元素重复以上的步骤,除了最后一个(最后一个已经是上一趟中找出的最大的元素了,不需要再排序)。
	 * 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
	 * 
	 * @param array
	 */
	public static void bubbleSort(final int[] array) {
		System.out.println("冒泡排序开始:\n0:" + Arrays.toString(array));
		int changeNum = 1;
		for (int i = 0; i < array.length - 1; i++) {
			System.out.println("开始第" + (i + 1) + "趟");
			for (int j = 0; j < array.length - 1 - i; j++) {
				if (array[j] > array[j + 1]) {
					final int temp = array[j];
					array[j] = array[j + 1];
					array[j + 1] = temp;
					System.out.println(changeNum++ + ":" + Arrays.toString(array));
				}
			}
		}
		System.out.println("冒泡排序结束!");

		/*
		 * 冒泡开始:
		 * 0:[3, 1, 6, 4, 5, 2]
		 * 开始第1趟
		 * 1:[1, 3, 6, 4, 5, 2]
		 * 2:[1, 3, 4, 6, 5, 2]
		 * 3:[1, 3, 4, 5, 6, 2]
		 * 4:[1, 3, 4, 5, 2, 6]
		 * 开始第2趟
		 * 5:[1, 3, 4, 2, 5, 6]
		 * 开始第3趟
		 * 6:[1, 3, 2, 4, 5, 6]
		 * 开始第4趟
		 * 7:[1, 2, 3, 4, 5, 6]
		 * 开始第5趟
		 * 冒泡结束!
		 */

	}

	/**
	 * 选择排序原理:
	 * 先假设无序数组中第一个元素是最小元素(记住下标),从第二个开始依次和第一个比较;
	 * 如果比第一个小,就把最小元素下标替换掉;
	 * 依次比较完毕后,如果下标已经被替换,就把第一个元素和替换下标的元素交换位置;
	 * 然后开始下一轮比较(下一轮把上一轮找到的最小的元素去掉)
	 * 
	 * @param array
	 */
	public static void selectSort(final int[] array) {
		System.out.println("选择排序开始:\n0:" + Arrays.toString(array));
		int changeNum = 1;

		int minIndex = 0;// 第n趟比较中的最小元素的下标
		for (int i = 0; i < array.length - 1; i++) {
			minIndex = i;// 无序区的最小数据数组下标
			for (int j = i + 1; j < array.length; j++) {// 在无序区中找到最小数据并保存其数组下标
				if (array[j] < array[minIndex]) {
					minIndex = j;
				}
			}
			if (minIndex != i) {
				// 如果不是无序区的最小值位置不是默认的第一个数据,则交换之。
				final int temp = array[i];
				array[i] = array[minIndex];
				array[minIndex] = temp;
				System.out.println(changeNum++ + ":" + Arrays.toString(array));
			}
		}
		System.out.println("选择排序结束!");

		/*
		 * 选择排序开始:
		 * 0:[3, 1, 6, 4, 5, 2]
		 * 1:[1, 3, 6, 4, 5, 2]
		 * 2:[1, 2, 6, 4, 5, 3]
		 * 3:[1, 2, 3, 4, 5, 6]
		 */
	}

	/**
	 * 快速排序:
	 * ①以第一个关键字 K1 为控制字,将 [K1 ,K2 ,…,Kn ] 分成两个子区,
	 * 使左区所有关键字小于等于 K1 ,右区所有关键字大于等于 K1 ,最后控制字居两个子区中间的适当位置。
	 * 在子区内数据尚处于无序状态。
	 * ②把左区作为一个整体,用①的步骤进行处理,右区进行相同的处理。(即递归)
	 * ③重复第①、②步,直到左区处理完毕。
	 * 
	 * @param array
	 */
	public static void quickSort(final int[] array) {
		if (array.length > 0) { // 查看数组是否为空
			System.out.println("快速排序开始:\n" + Arrays.toString(array) + "\n");
			quickSort(array, 0, array.length - 1);
			System.out.println("快速排序结束:\n" + Arrays.toString(array));
		}
	}

	private static void quickSort(final int[] array, final int low, final int high) {
		if (low < high) {

			final int middle = getMiddle(array, low, high); // 将list数组进行一分为二

			quickSort(array, low, middle - 1); // 对低字表进行递归排序

			quickSort(array, middle + 1, high); // 对高字表进行递归排序
		}
	}

	private static int getMiddle(final int[] array, int low, int high) {
		final int temp = array[low]; // 数组的第一个作为中轴
		while (low < high) {
			while (low < high && array[high] >= temp) {
				high--;
			}
			array[low] = array[high]; // 比中轴小的记录移到低端
			while (low < high && array[low] <= temp) {
				low++;
			}
			array[high] = array[low]; // 比中轴大的记录移到高端
		}
		array[low] = temp; // 中轴记录到尾
		return low; // 返回中轴的位置
	}

}


2

3


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值