题目来源

这是我在2019年研究生入学考试中遇到的一道题目,之前我们所认识的快速排序无外乎是以第一个元素或中位数作为枢轴。但是使用的第一个元素作为枢轴存在一个问题,我在接下来的分析中将进行阐述。但是各种博客以及论文中对于基于平均值的快速排序的具体都闭口不谈,后来我用了大概两三个小时通过修改现有的快速排序代码得到了基于平均值的快速排序代码。这也是我的第一篇博客,希望大家支持,这也是我继续写下去的动力。

原有快速排序算法

假设排序的数组是A[0]…A[n-1],首选任意选取一个数据,但是通常都是选择A[0]元素作为关键数据,然后将所有比他小的元素都放到他的左边,所有比他大的元素都放到他的右边,这一过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的快速排序。

一趟快速排序的算法是
1).设置两个变量i,j,排序开始的时候:i=0,j=N-1;
2). 一般以第一个数字元素作为关键元素,赋值给key,即key=A[0];
3). 从j开始向前搜索,即由后向前进行搜索(j–),扎到第一个小于key的值,将A[j]与A[i]的值交换;
4). 从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]的值交换;
5). 重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。
这一部分的分析我就不多进行解释了,因为网上的各种博客都已经写的很清楚的,代码也很成熟了。

原有算法的缺陷

1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
如果这个是使用第一个元素进行分割的话,那么将分割9次,这样就将快速排序的时间复杂度从O(nlog2n)增加到了O(n2)。对于快速排序来说,最优的方式就是平均分割,但是当原有序列基本有序或者基本逆序的情况下,以第一个元素分割的结果就会十分不平衡。所以我们应该选择一个最平均的分割方式,这个方式就是基于平均值为枢轴的快速排序。

代码

#include<stdio.h>
void quicksort(int A[],int low,int high){if(low<=high) {int i,j,temp,sum=0,ave,t;for(i=low;i<=high;i++){sum+=A[i];}i = low;j = high;ave = sum/(high-low+1);while(i<j){while(A[i]<ave&&i<=j)  ++i;while(A[j]>ave&&i<=j)  --j;if(i<j){temp = A[i];A[i] = A[j];A[j] = temp;i++;j--;}}if(i<high&&j>low){quicksort(A,low,j);quicksort(A,i,high);}else return;}
}

基于平均值为枢轴的快速排序算法相关推荐

  1. 快速排序算法(基于Java实现)

    title: 快速排序算法(基于Java实现) tags: 快速排序算法 快速排序算法的原理与代码实现: 一.快速排序算法的原理 快排算法的思想是: 如果需要排序数组中下标从p到r之间的一组数据,我们 ...

  2. 快速排序算法_基于位运算的快速排序算法

    前言 如果你准备看这篇文章,我就当你是懂快速排序算法原理的. 下面是我在2018年10月3日想到的基于二进制位运算对正整数进行的一种快速排序算法,目前的代码只能对正整数进行有效的排序,当然,稍微修改一 ...

  3. java sort算法名称_快速排序算法(Quick Sort)(java)

    /** * 快速排序算法是基于分治策略的一种排序算法,下面是一个递归的快速排序. * @author liuy */ public class QuickSort { public static vo ...

  4. 解释什么是快速排序算法?_解释排序算法

    解释什么是快速排序算法? Sorting algorithms are a set of instructions that take an array or list as an input and ...

  5. 基于改进的RPCA人脸识别算法

    from:http://www.chinaaet.com/article/3000011311 基于改进的RPCA人脸识别算法 作者:首照宇,杨晓帆,莫建文 2015/11/15 18:04:00 摘 ...

  6. 【算法】快速排序算法的编码和优化

    参考资料 <算法(第4版)>          - - Robert Sedgewick, Kevin Wayne <啊哈! 算法>              - - 啊哈磊 ...

  7. 【图文解释】快速排序算法

    高快省的排序算法 有没有既不浪费空间又可以快一点的排序算法呢?那就是"快速排序"啦!光听这个名字是不是就觉得很高端呢. 假设我们现在对"6  1  2 7  9  3   ...

  8. 【大话数据结构算法】快速排序算法

    快速排序是交换类的排序,比如在站队的时候,老师说:"第一个同学出列,其他同学以第一个同学为中心,比他矮的全排在左边,比他高的全排在右边."这就是一趟快速排序.可以看出,一趟快速排序 ...

  9. python实现快排算法_Python实现快速排序算法

    Python实现快速排序算法 快速排序算法是一种基于交换的高效的排序算法,由C.R.A.Hoare于1962年提出,是一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide and ...

最新文章

  1. 大数据druid查询不支持分页_Druid实时大数据分析查询(六)
  2. Jmeter简单应用6
  3. Mysql日志-RedoLog、UndoLog和BinLog的关系捋顺
  4. vue --- 购物车页面
  5. 高级java开发_适用于高级Java开发人员的十大书籍
  6. 使用ESXi-Customizer为esxi注入第三方驱动
  7. linux C++ socket编程 实例
  8. XP系统优化简单实用技法
  9. 汽车美容4s连锁店会员管理系统【源码分享】
  10. matlab鼠标箭头黑色,个性化的黑色箭头鼠标指针(falchion光标)安装版本
  11. 9 Creating a Chain of Effects
  12. Coinbase 研究:Web3 开发者堆栈指南
  13. 充电系列-1-msm8909充电驱动常见修改
  14. 后台管理----首页布局分析1
  15. MyBatis面试题库
  16. matlab求状态反馈矩阵
  17. SpringBoot和Vue跨域问题
  18. 视频转动态图片gif怎么制作?教你一招轻松转换
  19. 毕业季,从学生到上班族的华丽转身
  20. 赠书福利|SpaceX的成功,意味着新太空竞赛的开始?

热门文章

  1. 求弹性模量和泊松比计算题_弹性模量E和泊松比
  2. BULK INSERT如何将大量数据高效地导入SQL Server
  3. wallpaper engine怎么用?
  4. 有关B2C制造业电商企业的数字化转型思考
  5. 2022年危险化学品经营单位主要负责人复训题库及模拟考试
  6. linux镜像文件太大不好下载_这是什么神仙系统?支持安卓程序 + Windows 程序 + Linux 程序...
  7. 基于ROS_Arduino室内移动机器人SLAM实验测试
  8. ui设计和平面设计区别,平面设计好还是ui好
  9. Bitmap 的四种压缩方式详解
  10. GIT克隆项目出现:The authenticity of host ‘gitee.com (xxx.xxx.xxx.xxx)‘ can‘t be established.