首页 > 编程语言 >学习笔记之算法快速排序

学习笔记之算法快速排序

时间:2024-03-25 18:46:21浏览次数:27  
标签:arr right int 笔记 high 算法 low pivot 排序

快速排序

听说有的公司面试会考?0.0

快速排序思想:分治法

  基本思想:1、从数列中选出一个数

       2、分区(遍历),比它大的放他右边,比它小的或者等于的,放他左边

       3、对左右区间重复第2步,直到区间只有一个数(递归)


参考:快速排序 | 菜鸟教程 (runoob.com)

在该网站中将思想2的实现称为挖坑填数,我称之为找例外,那么怎么找?

 

 

 简单描述,结合上图:

一开始i和j分别站在0,与9的位置,我们根据思想1选出参考数72

然后j开始从右边往左边找,由于右边分区的数都应该比72大,j走到8的位置认为48很突兀,把48扔到左边参考数空出来的位置0,左边多了右边少了一个数字,j站定轮到i出手,

i从左边往右边找,左边应该都是比参考数72小于等于的数,i走到位置3看到突兀的88,把他扔到右边空出来的位置8,i在位置3站定,轮到j操作,

j从之前站定的位置8出发,走到位置5,把突兀的42扔到左边空位位置3,在位置5站定,轮到i操作,

i从位置3出发,走到位置5与j见面,两人协商后把参考数放在空位5,

 

代码实现:

正经人不手写代码,以下代码ai生成后人为检查:

 1 // 分区函数:挖坑填数法
 2 int partition(std::vector<int>& arr, int low, int high) {
 3     // 选取基准元素
 4     int pivot = arr[low];
 5     // 记录挖的坑的位置
 6     int left = low;
 7     int right = high;
 8 
 9     // 当左右指针未相遇时,继续循环
10     while (left < right) {
11         // 从右侧找到第一个小于基准元素的值
12         while (left < right && arr[right] >= pivot)
13             right--;
14         // 将右侧小于基准元素的值填入左侧坑位,left等right也没事,
15         arr[left] = arr[right];
16 
17         // 从左侧找到第一个大于基准元素的值
18         while (left < right && arr[left] <= pivot)
19             left++;
20         // 将左侧大于基准元素的值填入右侧坑位
21         arr[right] = arr[left];
22     }
23 
24     // 将基准元素放入最终的坑位
25     arr[left] = pivot;
26     // 返回基准元素的位置
27     return left;
28 }
// 快速排序函数
void quickSort(std::vector<int>& arr, int low, int high) {
    if (low < high) {
        int pivot_index = partition(arr, low, high);
        quickSort(arr, low, pivot_index - 1);
        quickSort(arr, pivot_index + 1, high);
    }
}

代码注意的几个点:

arr数组传参用的引用,可以用指针吗?

快速排序入口检查low小于high,请注意,分区后再整理子区,左右两个分区都是不包含pivot_index 这个值的,当low比high小于1的时候,pivot_index 将是它们两者之一,临界检查通过。

 

标签:arr,right,int,笔记,high,算法,low,pivot,排序
From: https://www.cnblogs.com/W-cats/p/18095044

相关文章

  • Vue学习笔记59--store(getters + )
    store(getters) 示例一:Count.vue<template><div><h3>当前求和为:{{$store.state.sum}}</h3><h3>当前求和*10为:{{$store.getters.bigSum}}</h3><!--<selectv-model="selectNo"><option:va......
  • 排序算法练习——最大间距:给定一个未排序的数组,找到排序后相邻元素之间的最大差值
    最大间距:给定一个未排序的数组,找到排序后相邻元素之间的最大差值。解决这个问题可以使用桶排序的思想。具体步骤如下:找到数组中的最大值和最小值。根据数组的长度,将数组划分成一定数量的桶,每个桶存放一定范围内的元素。计算每个桶内元素的最小值和最大值。遍历桶,计算相邻......
  • 排序算法练习——按照字符串的异位词分组:给定一个字符串数组,将所有异位词(字符相同但顺
    按照字符串的异位词分组:给定一个字符串数组,将所有异位词(字符相同但顺序不同的字符串)分组到同一个组中。要按照字符串的异位词分组,可以使用哈希表来将每个字符串排序后作为键,相同键的字符串即为异位词。以下是实现这个算法的Python代码:fromcollectionsimportdefaultdict......
  • 算法基础模板
    目录算法模版——基础篇1、整数二分2、浮点数二分3、高精度加法4、高精度减法5、高精度乘低精度6、高精度除以低精度7、一维前缀和8、二维前缀和9、一维差分10、二维差分11、位运算12、双指针算法13、离散化14、区间合并15、单链表16、双链表17、栈18、队列1.普通队列2.循环队列......
  • 机器学习的核心算法 - CNN的原理探讨
    很悲哀,类似这样的技术性问题讨论,和其他很多我感兴趣的问题,我现在很多时候只能采用异步模式,比如发帖来解决,然后实时的交互,只能跟GPT聊。我找不到合适的朋友,对相关话题感兴趣,并且程度和我相当,能聊得下去。1引子- 梯度爆炸结论:梯度爆炸就是求参失败。sweetie,我是AI运算的小白......
  • 学习笔记-d2l
    2.1TensorFlow中的Tensors是不可变的,也不能被赋值。TensorFlow中的Variables是支持赋值的可变容器。请记住,TensorFlow中的梯度不会通过Variable反向传播。如果我们用Y=X+Y,我们将取消引用Y指向的张量,而是指向新分配的内存处的张量。assign将一个操作的结果分配给一个Var......
  • Vue学习笔记58--vuex
    vuex专门在Vue中实现集中式状态(数据)管理的一个Vue插件,对Vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信。Github地址:https://github.com/vuejs/vuex什么时候使用Vuex多个组件依赖于同一状态来自不同组件的行为需要......
  • 如何读论文 李沐视频笔记
    前言内容不多,但姑且记下来加深印象好了[视频链接](https://www.bilibili.com/video/BV1H44y1t75x/?spm_id_from=333.788&vd_source=0e55873fcd6a0d01839a7f7f37c36254)内容总概读论文的重点在于筛选出适合自己的论文,通过三遍阅读来找出并吸收论文大致分为1、标题title2、摘......
  • 磁盘扩容,逻辑卷方式笔记
    相关概念:1.逻辑卷LVMLVM(LogicalVolumeManager)逻辑卷管理,是一种将一个或多个硬盘的分区在逻辑上集合,相当于一块大硬盘使用,空间不足可以继续将新硬盘或其他硬盘的分区加入其中,可以实现硬盘空间的动态管理,相比于磁盘分区,可以实现更好更方便的管理。2.PV、VG、LVPV(PhysicalV......
  • 算法模板 v1.10.4.20240325
    算法模板v1.1.1.20240115:之前历史版本已不可寻,创建第一份算法模板。v1.2.1.20240116:删除“编译”-“手动开栈”;删除“编译”-“手动开O优化”;修改“编译”-“CF模板”;删除“读写”;删除“图论”-“欧拉图”-“混合图”;删除“图论”-“可达性统计”;删除“数据类型”-“高精类”。......