原理:

通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。

#include <stdio.h>
#define MAXSIZE 9typedef struct {int r[MAXSIZE+1];    //r[0] 作为哨兵int length;            //待排序的数组长度
}SqList;void print(SqList L){int i;for(i=1; i<MAXSIZE; i++){printf("%3d,",L.r[i]);}printf("%3d\n",L.r[i]);
}void swap(SqList * L, int i, int j){int temp=L->r[i];L->r[i]=L->r[j];L->r[j]=temp;
}void QuickSort(SqList * L){void Qsort(SqList * L, int low, int high);Qsort(L,1,L->length);
}void Qsort(SqList * L, int low, int high){int Partition(SqList * L,int low, int high);int pivot;//注意在边界的地方要判断,pivot=1或者pivot=length,做处理if(low < high){pivot=Partition(L, low, high);//将L->[low-high]一分为二,返回pivotkey所在位置的下标Qsort(L,low,pivot-1);Qsort(L,pivot+1,high);}
}int Partition(SqList * L,int low, int high){int pivotkey=L->r[low];while(low < high){while(low < high && L->r[high]>=pivotkey) high--;swap(L,low,high);while(low < high && L->r[low]<=pivotkey) low++;swap(L,low,high);}return low;    //返回pivotkey当前的下标
    }int main(){SqList L;int num[MAXSIZE+1]={9,7,4,3,2,1,6,5,9,8};for(int i=0; i<10; i++){L.r[i] = num[i];}L.length=9;
//快排QuickSort(&L);print(L);
return 0;
}

时间复杂度

快速排序涉及到递归调用,所以该算法的时间复杂度还需要从递归算法的复杂度开始说起;
递归算法的时间复杂度公式:T[n] = aT[n/b] + f(n)  ;参考之前归并排序对递归算法时间复杂度的计算;

最优情况下时间复杂度

此时的时间复杂度公式则为:T[n] = 2T[n/2] + f(n);T[n/2]为平分后的子数组的时间复杂度,f[n] 为平分这个数组时所花的时间;
下面来推算下,在最优的情况下快速排序时间复杂度的计算(用迭代法):
                            T[n] =  2T[n/2] + n                                                                     ----------------第一次递归
                                                    =  2 { 2 T[n/4] + (n/2) }  + n                                               ----------------第二次递归

                                                    =  2^2 T[ n/ (2^2) ] + 2n

                                                    =  2^2  {  2 T[n/ (2^3) ]  + n/(2^2)}  +  2n                         ----------------第三次递归  

                                                    =  2^3 T[  n/ (2^3) ]  + 3n

                                                    =  2^m T[1]  + mn                                                  ----------------第m次递归(m次后结束),只需要对1个元素的情况进行复杂符分析,即T(1)。

               当最后平分的不能再平分时,也就是说把公式一直往下跌倒,到最后得到T[1]时,说明这个公式已经迭代完了(T[1]是常量了)。

               得到:T[n/ (2^m) ]  =  T[1]    ===>>   n = 2^m   ====>> m = logn;

               T[n] = 2^m T[1] + mn ;其中m = logn;

               T[n] = 2^(logn) T[1] + nlogn  =  n T[1] + nlogn  =  n + nlogn  ;其中n为元素个数

               又因为当n >=  2时:nlogn  >=  n  (也就是logn > 1),所以取后面的 nlogn,即最有情况下的时间复杂度为O(nlogn);(注意:这里logn表示以2为底的n的对数)

最差情况下时间复杂度                  这种情况时间复杂度就好计算了,就是冒泡排序的时间复杂度:T[n] = n * (n-1) = n^2 + n;

    平均时间复杂度    

       快速排序的平均时间复杂度也是:O(nlogn)。
平均的情况,设枢轴的关键字应该在第k的位置(1≤k≤n),那么:
用数学归纳法可证明,其数量级为0(nlogn).

空间复杂度

其实这个空间复杂度不太好计算,因为有的人使用的是非就地排序,那样就不好计算了(因为有的人用到了辅助数组,所以这就要计算到你的元素个数了);我就分析下就地快速排序的空间复杂度吧;
首先就地快速排序使用的空间是O(1)的,也就是个常数级;而真正消耗空间的就是递归调用了,因为每次递归就要保持一些数据;
 
稳定性:
由于关键字的比较和交换是跳跃进行的,因此,快速排序是不稳定的排序方法。

转载于:https://www.cnblogs.com/Allen-win/p/7307861.html

排序算法7---快速排序算法相关推荐

  1. 排序算法:快速排序算法实现及分析(递归形式和非递归形式)

    快速排序算法介绍 从名字上就可以看出快速排序算法很嚣张,直接以快速命名.确实快速排序 的确很快速,被列为20世纪十大算法之一.程序员难道不应该掌握么.快速排序(Quick Sort)的基本思想是:通过 ...

  2. 十大排序算法:快速排序算法

    一.快速排序算法思想或步骤 分解: 数组A[p-r]被划分为两个子数组A[p-q-1]和A[q+1-r],使得A[q]为大小居中的数,左侧A[p-q-1]中的每个元素都小于等于它,而右边A[q+1-r ...

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

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

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

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

  5. linux公社 java算法_Java快速排序算法

    快速排序算法思想: 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一 ...

  6. 【算法】快速排序算法原理及实现

    1.什么是快速排序算法 快速排序是对冒泡排序的一种改良版,通过一趟排序,把要排序的序列分割成两个部分,一部分的所有数据要比另一部分的数据都小,然后再根据这两部分的数据来进行快速排序.以此来达到整一个数 ...

  7. MATLAB实现冒泡排序算法和快速排序算法

    冒泡算法(Bubble Sort)--一种计算机科学领域的较简单的排序算法. 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小.首字母从Z到A)错误就把他们交换过来.走访元素 ...

  8. 图解排序算法之快速排序算法

    精心整理的快速排序,并配图加代码,方便理解,实属不易,但是难免不了存在纰漏,感谢大家的指正与理解!觉的写的不错的小伙伴儿,一键三连支持一下,后期会有持续更新!!抱拳了罒ω罒 1. 算法思路 1.先从数 ...

  9. MATLAB输入排序代码,matlab快速排序算法实现

    只有C中的qsort存在,调用比较麻烦,其实在数据结构中,快速排序法是经典排序之一,上网搜了一下简介,把对应的VC程序改了一下,做成了下面的matlab代码: %  快速排序法 %  基本的思想:通过 ...

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

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

最新文章

  1. Hibernate映射解析——七种映射关系
  2. linux 设备驱动程序开发 第3版_Chapter2_The Current Process
  3. 基于Sanic的微服务基础架构
  4. vb子程序未定义怎么改怎么办_vb中子程序或者函数未定义!求教解决方案,
  5. hibernate文档
  6. Emacs收发email
  7. 小D课堂 - 零基础入门SpringBoot2.X到实战_第2节 SpringBoot接口Http协议开发实战_9、SpringBoot基础HTTP其他提交方法请求实战...
  8. 两直线夹角求解-Python编程实现
  9. 机房服务器搬迁验收文档,idc机房服务器搬迁之后的准备工作和应对
  10. Android系统ANR错误实战分析
  11. 如何刷新bios?在windows系统上刷新bios的方法
  12. epub直接获取书名及书封面
  13. 分块算法板子luogu1903
  14. 大专学的计算机如何进国企,专科毕业生想进国企?这三大专业不要错过,成功率高达60%...
  15. centos镜像下载教程
  16. 研究发现有适用于欧洲GDPR法规的加密货币解决方案
  17. K-Means算法及其变种,优缺点分析笔记
  18. trheejs中常用灯光总结
  19. cpu使用率低负载高
  20. tbc怀旧服服务器位置,关于《魔兽世界》TBC怀旧服,来看看官方问答汇总吧

热门文章

  1. 丽水风光(二)—劫色“古堰画乡”
  2. php限制字符输入,.NET_asp.net(c#)限制用户输入规定的字符和数字的代码,一下是这个代码: 只允许 用 - phpStudy...
  3. 回归 统计绘图_手把手教绘制回归分析结果的森林图「GraphPad Prism和Excel」
  4. android camera 降低帧率_Android性能问题分析之bugreport
  5. linux停止mysql后又自己启动,Linux上 mysql启动/停止/重启/开机启动/开机禁止启动...
  6. Paper4:Voxel-Based Extraction and Classification of 3-D Pole-Like Object From Mobile LIDAR Point Clo
  7. PCL:点云数据基于法线的边界提取(从最初的法线估计理论推导到最终的边界提取)
  8. 力扣(LeetCode)刷题,简单题(第2期)
  9. sklearn 朴素贝叶斯分类示例
  10. 【深度学习理论】(4) 权重初始化,Batch Normalization