IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 排序算法 - 快速排序详解 -> 正文阅读

[数据结构与算法]排序算法 - 快速排序详解

作者:token keyword

基本思想

对于一组数据,选择一个基准元素(base),通常选择第一个或最后一个元素,通过一轮扫描,比base小的元素都在base左边,比base大的元素都在base右边,对左右子序列用相同的方法递归排序,直到序列中所有数据均有序为止。

快速排序,说白了就是给基准数据找其正确索引位置的过程。

在这里插入图片描述

思路图解

[19,97,09,17,01,08] 为例,以第一个元素19为base,定义左右两个指针 L和 R,分别从两端开始扫描。从右向左找比19小的数,替换L所在位置的元素。再从左往右找比19大的数,然后替换R所在位置的元素。重复此过程直至L和R重合(两个指针指向同一元素),base替换此元素,此时第一轮结束。再递归排序base左右两部分的元素。
在这里插入图片描述
首先R从后向前扫描,如果扫描到的值大于基准数据就让R减1,然后继续往前扫描,直到发现有元素比该基准数据的值小(如上图中08<=base),就将R位置的值赋值给L位置 ,结果如下:

在这里插入图片描述

然后交替移动L下标:L从前往后扫描,如果扫描到的值小于基准数据就让L加1,然后继续向后扫描,直到发现有元素大于基准数据的值(如上图97>=base),就再将L位置的值赋值给R位置的值,指针移动并且数据交换后的结果如下:

在这里插入图片描述
然后交替移动R下标,向前移动,直到扫描到小于基准数的值,如上图继续扫描到 01 <= 19,则就将R位置的值赋值给L位置 ,结果如下:
在这里插入图片描述
然后继续交替移动L下标,向后移动,如上图L一直向后扫描,09比基准数小,继续后移,17比基准数小,继续后移,这时候L和R重合,则base替换此元素。
在这里插入图片描述
左子序列都比19小,右子序列都比19大
在这里插入图片描述
然后对左右子序列重复以上操作即可。

代码实现

/**
 * @ClassName QuickSort
 * @author: shouanzh
 * @Description 快速排序
 * @date 2022/5/8 17:42
 */
public class QuickSort {

	public static void main(String[] args) {
		int[] array = new int[]{100, 89, 66, 1, -1, 30, 5, 85, -25};

		quickSort(array, 0, array.length - 1);

		System.out.println(Arrays.toString(array)); // [-25, -1, 1, 5, 30, 66, 85, 89, 100]
	}

	/**
	 * 快速排序
	 * @param arr 数组
	 * @param left 数组左边界
	 * @param right 数组右边界
	 */
	private static void quickSort(int[] arr, int left, int right) {

		if (left < right) {
			// 每次分割的点pos
			int pos = partition(arr, left, right);

			// 左子序列 比base小的数字的数组
			quickSort(arr, left, pos - 1);
			// 右子序列 比base大的数字的数组
			quickSort(arr, pos + 1, right);
		}

	}


	private static int partition(int[] arr, int left, int right) {
		// 基准数据
		int base = arr[left];
		while (left < right) {
			// 从后向前找,比base大,right--
			while (left < right && arr[right] >= base) {
				right--;
			}
			// 比base小,替换left所在位置的数字
			arr[left] = arr[right];

			// 从前向后找,比base小,left++
			while (left < right && arr[left] <= base) {
				left++;
			}
			// 比base大,替换right所在位置的数字
			arr[right] = arr[left];

		}
		// 此时left=right,用base替换这个位置的数字
		arr[left] = base;
		return left; // 返回base的正确位置
	}
}

🤯

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-09 12:59:06  更:2022-05-09 13:00:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:35:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码