当前位置: 首页 > wzjs >正文

兰州网站建设哪家专业淘词神器

兰州网站建设哪家专业,淘词神器,wordpress资讯网站模板,c2c模式的典型网站一、快速排序基本思想 想象你有一堆杂乱的书需要按编号排列。快速排序的做法是: 1️⃣ 随便选一本书作为"基准书" 2️⃣ 把比它小的放左边,比它大的放右边 3️⃣ 对左右两堆书重复这个过程 二、代码逐行解析 1. 随机数生成 int getRand(int…

一、快速排序基本思想

想象你有一堆杂乱的书需要按编号排列。快速排序的做法是:
1️⃣ 随便选一本书作为"基准书"
2️⃣ 把比它小的放左边,比它大的放右边
3️⃣ 对左右两堆书重复这个过程


二、代码逐行解析

1. 随机数生成
int getRand(int min, int max) {return (rand() % (max - min + 1)) + min;
}

作用:生成[min,max]范围内的随机数
类比:闭着眼睛从书堆里随机摸一本书


2. 核心排序逻辑
void quick_sort(int arr[], int low, int high) {if(low >= high) return; // 终止条件:只剩一本书时不需要整理// 🎯 随机选基准书int t_id = getRand(low, high);int tmp = arr[t_id];// 📌 初始化两个"整理员"int i = low-1;  // 左整理员(从最左边开始往右走)int j = high+1; // 右整理员(从最右边开始往左走)while(i < j) {// 👉 右整理员找小书while(arr[--j] > tmp); // 一直往左走,直到找到比基准小的书// 👈 左整理员找大书while(arr[++i] < tmp); // 一直往右走,直到找到比基准大的书if(i < j) swap(arr[i], arr[j]); // 交换两本放错位置的书}// ✂️ 分割成左右两堆继续整理quick_sort(arr, low, j);    // 整理左边小书堆quick_sort(arr, j+1, high); // 整理右边大书堆
}

三、动态演示

假设要排序数组 [3,1,4,2,5],随机选中3作为基准:

步骤1️⃣:整理员开始工作

初始状态:i=-1, j=5
[3,1,4,2,5]↑       ↑右整理员j找到2(比3小) → j=3
左整理员i找到4(比3大) → i=2
交换后:[3,1,2,4,5]继续循环:
右整理员j移动到1 → j=1
左整理员i移动到4 → i=3
此时i>j,循环结束

步骤2️⃣:分割区间

分割点j=1 → 左区间[0,1],右区间[2,4]
继续递归处理左右区间

四、关键点解释

为什么要随机选基准?

如果总是选第一个元素,遇到已排序数组时效率会退化成O(n²)。随机选择能避免最坏情况。

i和j的移动顺序
  • --j 先移动再判断:避免死循环
  • ++i 先移动再判断:保证每次循环都有进展
循环终止条件

当i和j相遇或交叉时(i >= j),说明分区完成


五、存在的问题

当所有元素相同时(如全2),每次只能确定一个元素的位置,时间复杂度退化为O(n²)。解决方法:

+ 使用三路快排,将数组分为 <、=、> 三部分
+ 遇到重复元素时直接跳过中间区域

六、性能对比

情况平均时间复杂度最坏时间复杂度
普通快排O(nlogn)O(n²)
三路快排O(nlogn)O(nlogn)

逐步解释:

普通的快速排序在最坏情况下(例如所有元素完全相同)仍然会出现 O(n²) 的时间复杂度。以下是详细分析:


一、问题根源

当数组中所有元素相同时,代码的分区逻辑会失效:

  1. 每次分区只能确定一个元素的位置
    假设数组为 [2,2,2,2,2]

    • 随机选择基准后,ij 会在首尾相遇
    • 分区后左区间为整个数组,右区间为空
    • 每次递归只能排除一个元素(基准本身)
  2. 递归深度变为 O(n)
    导致总操作次数为:

    n + (n-1) + (n-2) + ... + 1 = n(n+1)/2 → O(n²)
    

二、代码验证

以全为 2 的数组 [2,2,2,2,2] 为例:

  1. 第一次分区

    • ilow-1=-1 开始右移,直到 i=4(越界)
    • jhigh+1=5 开始左移,直到 j=0
    • 分区后:左区间 [0,0],右区间 [1,4]
  2. 递归右区间 [1,4]
    重复上述过程,每次只能排除一个元素。


三、解决方法

使用 三路快速排序 优化重复元素处理:

  1. 将数组分为三部分
    • < pivot= pivot> pivot
  2. 跳过重复元素区域
    递归时只需处理 <> 的部分。

四、三路快排核心代码
void quick_sort(int arr[], int low, int high) {if (low >= high) return;// 随机选择基准并交换到low位置int t_id = getRand(low, high);swap(arr[low], arr[t_id]);int pivot = arr[low];// 三路分割初始化int lt = low;      // 最后一个小于pivot的位置 (less than)int gt = high;     // 第一个大于pivot的位置 (greater than)int i = low + 1;   // 当前遍历指针while (i <= gt) {if (arr[i] < pivot) {swap(arr[i], arr[lt]);lt++;i++;} else if (arr[i] > pivot) {swap(arr[i], arr[gt]);gt--;} else {i++;}}// 递归处理左右区域quick_sort(arr, low, lt - 1);  // 处理 < 部分quick_sort(arr, gt + 1, high); // 处理 > 部分
}

五、复杂度对比
情况原代码(双路快排)三路快排
普通数组O(n log n)O(n log n)
全相同元素O(n²)O(n)

六、总结
  • 原代码问题:随机化基准无法解决全相同元素的极端情况,时间复杂度仍可能为 O(n²)。
  • 终极解决方案:通过三路快排跳过重复元素区域,将最坏情况复杂度优化至 O(n)。
http://www.dtcms.com/wzjs/284408.html

相关文章:

  • 专门做微信公众号的网站seo网络推广到底是做什么的
  • 用jsp做网站南京网站seo
  • 物流企业网站建设规划书seo推广公司
  • 哪家公司建网站最好百度竞价托管靠谱吗
  • 做问答营销的网站有哪些经营管理培训课程
  • 垂直版面网站seo网站诊断方案
  • 网站建设金手指排名信誉如何做谷歌seo推广
  • 太原哪家网站建设公司好站长统计推荐
  • 用wordpress建立专业网站视频教程青岛网站seo公司
  • 可以做哪些网站有哪些内容吗查网址
  • 网站建设 开发网站seo哪家做的好
  • 出色的网站网站收录查询爱站
  • 有了公网ip如何做网站推销产品怎么推广
  • 北京网站建设外包公司曹操论坛seo
  • 电商做网站什么意思培训机构有哪些
  • 做企业网站的人才搜索引擎营销推广
  • 公司做网站都咨询哪些问题原画培训机构哪里好
  • 请网站制作公司费用百度竞价教程
  • 邢台论坛网seo推广技术培训
  • 专业单位网站开发百度贴吧官网app下载
  • 企业做网站便宜年度关键词
  • 网站建设开发图片app推广引流
  • 网站实现步骤及方法宁波seo企业网络推广
  • 网络营销方式分析太原网站快速排名优化
  • 石家庄便宜网站制作站长工具网站查询
  • 域名申请步骤seo推广百度百科
  • vs做网站案例上海网站优化
  • 虚拟服务器和如何创建网站哪个平台做推广效果好
  • 哪个彩票网站做代理反水高百度旗下有哪些app
  • wordpress能否做网站史上最强大的搜索神器