排序算法之快速排序【小二讲堂】

【排序思想】
快速排序思路:* 类说明 :快速排序

  • 1.在一组数据中,选择一个数作为基准(一般选择第一个数)
  • 2.所有小于“基准”的元素,都移到“基准”的左边,所有大于"基准"的元素都移动到右边
  • 3.对基准左右两边的元素不断重复1.2两步操作,直到所有子集的下一个元素为止。
    在这里插入图片描述
    上图只是给出了第1趟快速排序的流程。在第1趟中,设置x=a[i],即x=30。
    (01) 从"右 --> 左"查找小于x的数:找到满足条件的数a[j]=20,此时j=4;然后将a[j]赋值a[i],此时i=0;接着从左往右遍历。
    (02) 从"左 --> 右"查找大于x的数:找到满足条件的数a[i]=40,此时i=1;然后将a[i]赋值a[j],此时j=4;接着从右往左遍历。
    (03) 从"右 --> 左"查找小于x的数:找到满足条件的数a[j]=10,此时j=3;然后将a[j]赋值a[i],此时i=1;接着从左往右遍历。
    (04) 从"左 --> 右"查找大于x的数:找到满足条件的数a[i]=60,此时i=2;然后将a[i]赋值a[j],此时j=3;接着从右往左遍历。
    (05) 从"右 --> 左"查找小于x的数:没有找到满足条件的数。当i>=j时,停止查找;然后将x赋值给a[i]。此趟遍历结束!

按照同样的方法,对子数列进行递归遍历。最后得到有序数组!
【代码演示】

package com.myjava.quicksort;

import java.util.Arrays;

/**
 * 
 * @author Xiao er:
 * 
 * @version 创建时间:2019年4月1日 下午9:13:54
 *     类说明 :快速排序 
 *     1.在一组数据中,选择一个数作为基准(一般选择第一个数)
 *     2.所有小于“基准”的元素,都移到“基准”的左边,所有大于"基准"的元素都移动到右边
 *     3.对基准左右两边的元素不断重复1.2两步操作,直到所有子集的下一个元素为止
 */

public class QuickSort {

	public static void main(String[] args) {
		// 定义一个数组
		int[] arr = { 12, 23, 435, 56, 73, 3, 1 };
		System.out.println("排序前:" + Arrays.toString(arr));
		sort(arr, 0, arr.length - 1);
		System.out.println("排序后:" + Arrays.toString(arr));
	}
	/**
	 * @param arr    需要排序的数组
	 * @param low    开始左边的数
	 * @param high   右边的数
	 */
	public static void sort(int[] arr, int low, int high) {
		// 循环跳出
		if (low >= high) {
			return;
		}
		/*
		 * 由于在一趟排序过程中low和high所对应的数永远是不变的 在数组进行起始排序时
		 * 两个“指针”i和j,指向数组的开始和结束两个元素
		 */
		int i = low;
		int j = high;
		/*
		 * 定义基准数 在开始排序的过程中,将数组的第一个数作为基准数,
		 * 用于i和j对应的数进行比较,
		 * 将较小的数放在基准数的右侧,将较大的数放到基准数的右侧
		 */
		int key = arr[i];

		// 当i>=j时,说明数组已经排序完成
		while (i < j) {
			// 当数组中地arr[j]个元素比key基准大时,不用比较进行下一个比较
			while (arr[j] >= key && i < j) {
				j--;
			}
			// 如果上述条件不成立则进行换位
			if (i < j) {
				int t = arr[j];
				arr[j] = arr[i];
				arr[i] = t;
			}

			// 数组中arr[i]元素比key基准数小时,无需比较直接跳过
			while (arr[i] <= key && i < j) {
				i++;
			}
			// 上述条件不成立时,进行换位
			if (i < j) {
				int t = arr[i];
				arr[i] = arr[j];
				arr[j] = t;
			}
			/**
			 * 在一趟排序完毕后,基准数的右侧放的都是无序的比基准数小的数 在基准数右侧放的都是无序的比基准数较大的数
			 * 例如:3,1,12(基准数),23,435,56,73 所以在此对基准数左右的无序“大小数”进行再次排序
			 */
			// 交换完毕一次后对基准左侧的“较小的数”进行排序
			// 将基准数左侧的小数看成一个数组进行比较排序
			sort(arr, low, i - 1);
			// 对基准右侧的“较大的数”进行排序
			sort(arr, i + 1, high);
		}
	}
}

排序算法大全:https://blog.csdn.net/mirror_w/article/category/8856271
小二课堂:https://blog.csdn.net/Mirror_w

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值