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

快速排序总结

快速排序属于交换排序。

算法思想:

快速排序的核心思想是分治法,通过选择一个基准元素(pivot),将序列分为两部分:小于基准的部分和大于基准的部分。然后递归地对这两部分进行排序。

在数组或者顺序存储的序列中,可以通过随机访问快速找到任意位置的元素,并通过交换操作高效地完成分区(partition)。然而,链表是顺序访问的数据结构,无法像数组一样高效地支持随机访问和交换操作

在待排序表[1...n]中任取一个元素pivot作为枢轴(或基准,通常取首元素),通过一趟排序将待排序表划分为独立的两部分L[1...k-1]和L[k+1...n],使得L[1...k-1]中的所有元素小于pivot,L[k+1...n]中的所有元素大于等于pivot,则pivot放在了其最终位置L(k)上,这个过程称为一次“划分”。然后分别递归地对两个子表重复上述过程,直至每部分内只有一个元素或空为止,即所有元素放在了其最终位置上。

//分区函数,返回枢轴元素的最终位置
int partition(int A[],int left,int right){
    if(left>=right) return left;
    //先设置随机数种子,确保每次运行程序时生成不同的随机数序列
    srand(time(NULL));
    //在当前序列中随机选一个元素作为枢轴
    int random_pos = left + rand()%(right - left +1);
    //将随机选择的枢轴元素交换到数组的第一个位置
    int temp = A[random_pos];
    A[random_pos] = A[left];
    A[left] = temp;
    int pivot = A[left];//用新的第一个元素作为枢轴
    while(left<right){  //用left和right搜索枢轴元素的最终位置
        //从右向左找到第一个小于等于枢轴的元素
        while(left<right && A[right]>pivot) right--;
        A[left] = A[right];
        //从左向右找到第一个大于枢轴的元素
        while(left<right && A[left]<=pivot) left++;
        A[right] = A[left];
    }
    A[left] = pivot;//把枢轴元素存放到最终位置
    return left;    //返回存放枢轴元素的最终位置
}

void quick_sort(int A[],int left,int right){
    if(left>=right) return;//递归结束
    int pivot_position = partition(A,left,right);
    quick_sort(A,left,pivot_position-1);
    quick_sort(A,pivot_position+1,right);
}

总结

算法表现主要取决于递归深度,若每次“划分”越均匀,则递归深度越低。“划分”越不均匀,递归深度越深。

快速排序性质
最好时间复杂度O(nlogn),每次划分很平均
最坏时间复杂度O(n^2),原本正序或逆序
平均时间复杂度O(nlogn)
最好空间复杂度O(logn)每次划分很平均
最坏空间复杂度O(n)
稳定性不稳定
适用性仅适用于顺序表,不适用于链表

相关文章:

  • Excel 豆知识 - 如何打开Online Web版 Excel/Word
  • 视频结构化框架VideoPipe-OpenCV::DNN-TensorRT安装教程【Nvidia各系列显卡-亲测有效】
  • 【数据结构】单链表
  • 【xiaozhi赎回之路-2:语音可以自己配置就是用GPT本地API】
  • 组件日志——etcd
  • 计算机操作系统(四) 操作系统的结构与系统调用
  • 【动态规划】不同路径
  • Js闭包Closure 及 其可能产生的内存泄漏问题
  • 详解 printf 打印的所有内容
  • C之(15)cppcheck使用介绍
  • 【中文翻译】第12章-The Algorithmic Foundations of Differential Privacy
  • 分布式事务与Seata
  • 题型笔记 | Apriori算法
  • 影视后期工具学习之PR(中)
  • 十亿级流量削峰实战:LinkedBlockingQueue缓冲池的工程化实现
  • 2024年MathorCup数学建模B题甲骨文智能识别中原始拓片单字自动分割与识别研究解题全过程文档加程序
  • 深入理解 C++11 智能指针:独占、共享与弱引用的完美管理
  • 19 数码管的动态显示
  • 第十二章 | Solidity 智能合约前后端集成实战
  • 深入理解倒排索引原理:从 BitSet 到实际应用
  • 中共中央、国务院印发《党政机关厉行节约反对浪费条例》
  • 菲律宾选举委员会公布中期选举结果,马科斯阵营选情未达预期
  • 新城市志|GDP万亿城市,一季度如何挑大梁
  • 国家统计局向多省份反馈统计督察意见
  • 北京警方:海淀发生小客车刮碰行人事故4人受伤,肇事司机已被查获
  • 从能源装备向应急装备蓝海拓展,川润股份发布智能综合防灾应急仓