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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 图解排序算法之快速排序算法 -> 正文阅读

[数据结构与算法]图解排序算法之快速排序算法

精心整理的快速排序,并配图加代码,方便理解,实属不易,但是难免不了存在纰漏,感谢大家的指正与理解!觉的写的不错的小伙伴儿,一键三连支持一下,后期会有持续更新!!抱拳了罒ω罒

1. 算法思路

1.先从数组中取出一个数(通常第一个数)作为基准数。
2.将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.对左右两边的子数组进行递归排序,直到只剩下一个元素则全部排序完成。

2. 性能

  • 时间复杂度:平均情况下的时间复杂度为O(nlogn)。最好的情况是O(n),最坏情况下时间复杂度为O(n2)。
  • 空间复杂度:它是一种原地排序,只需要一个很小的栈作为辅助空间,空间复杂度为O(log2n),所以适合在数据集比较大的时候使用。
  • 稳定性:不稳定的算法

3. 举例说明

??假如有一个数组,如下:在这里插入图片描述

  1. 首先,我们以第一个数为基准,然后定义两个哨兵 i 和 j ,首先哨兵 j 从后往前找比基准元素小的数的位置,然后哨兵 i 从前往后找比基准元素大的数的位置。
    在这里插入图片描述
  2. 找到指定元素后,将两个指定的元素互换位置。
    在这里插入图片描述
  3. 同理继续往后运行,直到 i 和 j 重合。
    在这里插入图片描述
  4. 直到哨兵i和哨兵j相遇,相遇位置的元素与基准元素交换。这时相遇位置左边的元素都比基准元素大,右边的元素都比基准元素小。将两边的元素各作为一个子序列进行递归操作。
    在这里插入图片描述

4. 代码示范

public class Test{
	 public static void main(String[] args) {
        int []nums = {5,9,8,7,2,4,2,3,6};
        quickSort(nums,0,nums.length - 1);
        for (int i = 0; i < nums.length; i++) {
            System.out.print(nums[i]+" ");
        }
    }
	/**
     *      快速排序
     * @param nums 待排序数组
     * @param low 数组的第一个元素的索引
     * @param high 数组的最后一个元素的索引
     */
	public static void quickSort(int[]nums,int low,int high){
		//只要两个哨兵相遇那么就退出递归!
		if(low >= high)return;
		//取出第一个数为基数————————————步骤1
		int mid = nums[low];
		int i = low,j = high;
		//i 和 j 两个哨兵没有相遇就一直查找
		while(i< j){
			// j哨兵往前查找,找到小于基数的位置
			while(i< j&& nums[j] >= mid) j--;
			// i哨兵往后查找,找到大于基数的位置
			while(i< j&& nums[i] <= mid) i++;
			//如果两个哨兵没相遇那就将两个交换——————————步骤2和3
			if(i< j)swap(nums,i,j);
		}
		//跳出循环,说明i和j哨兵相遇,并且相遇的位置的值一定是小于等于基数
		//将相遇的位置的值跟基数交换————————————步骤4
		nums[low] = nums[i];
		nums[i] = mid;
		//递归排序左边的子数组
		quickSort(nums,low,i - 1);
		//递归排序右边的子数组
		quickSort(nums,i + 1,high);
	}
	//交换函数
	public static void swap(int[]nums,int i,int j){
		int temp = nums[i];
		nums[i] = nums[j];
		nums[j] = temp;
	}

}

结果:

2 2 3 4 5 6 7 8 9 

快速排序还有很多改进版本,如随机选择基数,最后一位为基数等等,区间内数据较少时直接用另的方法排序以减小递归深度。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-14 23:11:55  更:2021-07-14 23:13:25 
 
开发: 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年5日历 -2024/5/7 22:47:56-

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