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

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

背景

之前我们介绍的选择排序、插入排序、快速排序的时间复杂度都是O(n2),在数据量较大时效率较低。因此我们利用分治思想设计出了两种效率更高的算法:归并排序和快速排序。归并排序和快速排序的时间复杂度都是O(nlogn),且在大多数情况下,快速排序比归并排序效率更高。

原理

快速排序的基本思想是分治原理,具体操作如下:

1. 在待排序的数组中先选择一个数作为基准值,然后遍历整个数组,将小于基准值的元素放到基准值左边,将大于基准值的元素放到右边,这样就确定了基准值最后的正确位置。

2. 递归处理基准值左侧子数组和右侧子数组,直到数组中只剩下一个元素,这样就实现了整个数组的排序。

具体实现步骤

1. 选取待排序数组的第一个元素作为基准值iPivot,并定义iLeft和iRight分别指向待排序数组的最左侧和最右侧。

2. 判断iRight指向的元素值nums[iRight]是否大于基准值iPivot。若是,则iRight继续向左移动,iRight--;否则,将nums[iRight]存放到nums[iLeft]处。(注意,此时nums[iLeft]值已经被保存或者放到了其他地方,因此该处可以用于保存新的元素值

3. 判断iLeft指向的元素值nums[iLeft]是否小于等于基准值(带等于这样将等于基准值的元素都存放到基准值的左侧)。若是,则iLeft继续向右移动,iLeft++;否则,将nums[iLeft]存放到nums[iRight]处。(注意,此时nums[iRight]值已经被存放到其他地方,因此该处可以用于保存新的元素值

4. 重复步骤2、3,直到iLeft、iRight相遇。此时需要将之前定义的基准值iPivot保存到中间位置,即下标iLeft处,这样即实现了基准值iPivot左侧的值都小于等于基准值,基准值右侧的值都大于基准值,基准值iPivot即为最终需要保存的位置。

5. 分别对基准值iPivot左侧子数组和右侧子数组分别递归使用上述方法实现排序,直至单个待排序数组大小个数为1,最终实现了整个数组的排序。

代码实现

/* 区间为左闭右闭原则 */
void QuickSort(int* piArray, int iLeft, int iRight)
{
	int iCurLeft = iLeft;
	int iCurRight = iRight;
    /* 选取第一个元素作为基准值,这样遍历的时候需要从右侧开始遍历 */
	int iPivot = piArray[iLeft];        

	if (iRight < iLeft)
	{
		/* 当待排序数组只有一个元素时结束递归 */
		return;
	}

	while (iCurLeft < iCurRight)
	{
		/* 先从右侧开始遍历 */
		while ((iCurLeft < iCurRight) && (piArray[iCurRight] > iPivot))
		{
			iCurRight--;
		}
		/* 将右侧不符合条件元素保存到左侧 */
		piArray[iCurLeft] = piArray[iCurRight];

		/* 再从左侧开始遍历 */
		while ((iCurLeft < iCurRight) && (piArray[iCurLeft] <= iPivot))
		{
			iCurLeft++;
		}
		/* 将左侧不符合条件元素保存到右侧 */
		piArray[iCurRight] = piArray[iCurLeft];
	}

	/* 将基准值iPivot放到中间位置,保证左边小于等于基准值,右边大于基准值 */
	piArray[iCurLeft] = iPivot;

	/* 递归排序基准值左侧子数组 */
	QuickSort(piArray, iLeft, iCurLeft - 1);
	/* 递归排序基准值右侧子数组 */
	QuickSort(piArray, iCurLeft + 1, iRight);

	return;
}

参考:快速排序算法_elma_tww的博客-CSDN博客_快速排序算法

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

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