1.基本想想

  • 快速排序使用分治的思想

  • 通过一趟排序将待排序列分割成两部分,其中一部分所有元素均比基准大,另一部分均比基准小

  • 分别对这两部分元素继续进行排序,以达到整个序列有序

2.快排的步骤

  • 1.选择基准
    在待排序列中,按照某种方式挑出一个元素,作为 “基准”(pivot)
  • 2.分割操作
    在基准左边的元素都比该基准小,在基准右边的元素都比基准大
  • 3.递归
    递归地对两个序列进行快速排序,直到序列为空或者只有一个元素

3.基准的选取

  • 固定位置
    取序列的第一个或最后一个元素作为基准
int pval = arr[left];
  • 随机选取基准
    取待排序列中任意一个元素作为基准
int pval = arr[rand()%(right-left)+left];
  • 三数取中
    对待排序序列中low、mid、high三个位置上数据进行排序,取他们中间的那个数据作为枢轴
void selectmedianofthree(int *arr, size_t left, size_t right)
{size_t mid = left + (right - left)/2;  //中部数据的下标if(arr[mid]>arr[right]){swap(arr[mid],arr[right]);}if(arr[left]>arr[right]){swap(arr[left],arr[right]);}if(arr[mid]>arr[left]){swap(arr[mid],arr[left]);  //把中间大小的数值放到首位,取为基准}
}

4.快排算法优化

  • 当待排序序列的长度分割到一定大小后,使用插入排序或者其它排序(数组短的时候,快排分割效率不高)
 if(left >= right){return;}else if(right-left > 0 && right-left < 20)
//数组长度较小时,调用希尔排序,减少调用快排{size_t len = right - left + 1;shellsort(len, &arr[left]); //数组首地址为&arr[left]}else{qsort(****);}
  • 在一次分割结束后,可以把与基准p相等的元素聚在一起,继续下次分割时,不用再对与基准p相等元素分割
void partion(int *arr, size_t left, size_t right, size_t &lessPnum, size_t &largePnum)//数据分段
{selectmedianofthree(arr,left,right);  //找出中间大小的哨兵,让分段尽量均匀,提高效率int pval = arr[left];  //中间大小的数赋值给哨兵int *temp = new int [right-left+1];  //开辟堆空间存放临时数组int tempLindex=0, tempRindex = right-left;  //临时数组的首末位下标for(int i = left+1; i <= right; ++i){if(pval > arr[i]) //比哨兵小的放在左边,从左边首位往中间写入,记录下比哨兵小的有多少个{temp[tempLindex++] = arr[i];++lessPnum;}if(pval < arr[i])  比哨兵大的放在右边,从右边末位中间写入,记录下比哨兵大的有多少个{temp[tempRindex--] = arr[i];largePnum++;}}for( ; tempLindex <= tempRindex; ++tempLindex)//中间还未被写入的位置,写入哨兵(哨兵可能是多个相同的值){temp[tempLindex] = pval;}for(int i = left, j=0; i <= right; ++i){arr[i] = temp[j++]; //把分好段的数组写回原数组{ [小于哨兵的], [等于哨兵的], [大于哨兵的] }}delete [] temp; //释放临时数组temp = NULL;  //指针置空
}

5.效率比较

同样的环境下,运行时间(s)

参考文献

https://blog.csdn.net/hacker00011000/article/details/52176100

快速排序quicksort算法优化相关推荐

  1. 快速排序(quicksort)算法实现

     快速排序(quicksort)是分治法的典型例子,它的主要思想是将一个待排序的数组以数组的某一个元素X为轴,使这个轴的左侧元素都比X大,而右侧元素都比X小(从大到小排序).然后以这个X在变换后数组的 ...

  2. 快速排序quicksort算法细节优化(一次申请内存/无额外内存排序)

    文章目录 1.只申请一次内存,避免多次递归调用时反复的申请和释放内存,提高程序运行效率 2.不申请内存,在原数组上直接排序 优化比较总结 对链接中快速排序进行代码优化 https://blog.csd ...

  3. 快速排序(Quick-Sort)及优化

    文章目录 前置基础知识 随机算法与快速排序 再来看快速排序 从C++STL 学习快速排序 算法题实战 排序数组 排序链表 盛水最多的容器 最小K个数 剑指offer21 调整数组顺序使奇数位偶数前面 ...

  4. quicksort算法_QuickSort算法–用C,Java,Python实现

    quicksort算法 介绍 (Introduction) Quicksort algorithm is one of the fastest internal sorting algorithms ...

  5. 快速排序(QuickSort)算法介绍

    算法简介 快速排序(Quicksort)是对冒泡排序的一种改进算法.由C. A. R. Hoare在1960年提出.该算法使用广泛.效率很高,是最重要的排序算法之一. 该算法的实现基本可分为以下几步: ...

  6. 冒泡排序c++代码_八大排序算法(解释+代码+结果+算法优化)

    >>>欢迎点赞,收藏,转发! 评论区获取源代码与更多更全干货!<<< 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,不需要访问外存便能完成 ...

  7. 快速排序(附优化方案)

    前言 快速排序的效率比冒泡排序相对快一些 快速排序的平均时间复杂度和最坏时间复杂度分别是O(nlgn).O(n^2) 而冒泡排序的时间复杂度是O(n^2) 关于快速排序的操作是怎样变化的看这个视频 秒 ...

  8. 【学习笔记】比较分别用prim和kruskal实现最小生成树和算法优化方案

    kruskal: 1.思路 :设G=(V,E)是无向连通带权图,V={,-,n}:设最小生成树T=(V,TE),该树的初始状态为只有n个顶点而无边的非连通图T=(V,{}),Kruskal算法将这n个 ...

  9. 理解快速排序 | 打通算法学习的任督二脉

    本文作者胡光 前百度高级算法研发工程师,ACM 国际大学生程序设计大赛亚洲区金牌获得者 具体内容来自他在极客时间开设的免费公开课<常用算法 25 讲> 排序算法在工作中最常用,也是学习很多 ...

最新文章

  1. Kali Linux Web***测试之 WebSploit
  2. ssl1007 and ssl -最大乘积 and 加法最大【区间dp练习】
  3. [js] 请使用js实现一个秒表计时器的程序
  4. 【数学+编程】对函数进行抽象
  5. 第七届 蓝桥杯 省赛 第八题 四平方和
  6. 【数学建模】基于matlab时变参数随机波动率向量自回归模型(TVP-VAR)【含Matlab源码 037期】
  7. 单片机百位计数c语言,单片机c语言版数管动态显示实验报告.doc
  8. smart原则_OKR 文化:用 SMART 原则量化目标
  9. auto CAD 常用快捷键指令
  10. chrome浏览pdf 字体变了
  11. 视觉目标跟踪算法收集-实时更新
  12. IndexError: Target 25 is out of bounds.
  13. Linux (中标麒麟)离线安装 Python
  14. (六)【模电】(基本放大电路)静态工作点的稳定
  15. 知识点 - 后缀数组
  16. bat 使用 7z 压缩文件夹
  17. 河道、地下水位监测方案
  18. 详解各种各样的 “BW” —OBW,IBW ,RBW,VBW
  19. 两数之差的补码等于被减数的补码与减数相反数的补码。_二进制的原码、反码、补码...
  20. 《CLRNet:Cross Layer Refinement Network for Lane Detection》论文笔记

热门文章

  1. 第七季4:网络telnet调试、海思proc文件系统调试接口
  2. linux内核的I2C子系统详解1——I2C总线概览、驱动框架概览
  3. 计算机三级会保研加分吗,366所高校有保研资格,除了对成绩有要求外,还有哪些要求?...
  4. Code First :使用Entity. Framework编程(6) ----转发 收藏
  5. 微信公众号--相关资料
  6. loadrunner11安装,提示少了Microsoft Visual c++2005 sp1运行时组件解决办法
  7. 洛谷P3405 [USACO16DEC]Cities and States省市
  8. Java微信公众平台获取签名
  9. Sqlite学习笔记(五)SQLite封锁机制
  10. 签名程序集密钥文件路径