快速排序基本特性

  1. 时间复杂度:O(n*lgn)
  2. 最坏:O(n^2)
  3. 空间复杂度:最好情况下:O(lgn),最坏情况:O(n),平均情况:O(lgn)
  4. 不稳定。

关于快速排序的空间复杂度,谢谢@命运他爹 同学指正。详述一下。

快速排序由于每次递归的时候会占用一个空间返回中间数位置,所以一次递归的空间复杂度为O(1)。

最好情况和平均情况下的递归深度为O(lgn),相应的空间复杂度就是O(lgn)

最坏情况下的递归深度为O(n),空间复杂度为O(n)。

算法

QUICKSORT(A, p, r)
if p < r
then q ← PARTITION(A, p, r) //关键
QUICKSORT(A, p, q - 1)
QUICKSORT(A, q + 1, r) PARTITION(A, p, r)
x ← A[r]
i ← p - 1
for j ← p to r - 1
do if A[j] ≤ x
then i ← i + 1
exchange A[i] <-> A[j]
exchange A[i + 1] <-> A[r]
return i + 1

示例

待排序数组:7  3  5  9  8  5  1  10  4  6

一趟排序过程分析:


源码

类声明

class BaseSort {
public:
BaseSort() { }
virtual void sort() = 0;
}; class QuickSort : public BaseSort {
public:
QuickSort(int Array[], int len) : BaseSort() {
this->Array = Array;
this->len = len;
}
void sort();
private:
int partition(int Array[], int start, int end);
void quicksort(int Array[], int start, int end);
private:
int* Array;
int len;
};

相关成员函数实现

void QuickSort::sort() {
quicksort(Array, 0, len-1);
}
void QuickSort::quicksort(int Array[], int start, int end) {
if ( start < end ) {
int mid = this->partition(Array, start, end);
if ( start < mid - 1 )
quicksort(Array, start, mid-1 );
if ( mid + 1 < end )
quicksort(Array, mid+1, end);
}
}
int QuickSort::partition(int Array[], int start, int end) {
int i, j, x, tmp;
x = Array[end];
i = start -1; for ( j = start; j < end; j++ ) {
if ( Array[j] <= x) {
i++;
tmp = Array[j];
Array[j] = Array[i];
Array[i] = tmp;
}
} tmp = Array[end];
Array[end] = Array[i+1];
Array[i+1] = tmp;
if (DEBUG) {
printArray(Array, len, "MidResult");
}
return i+1;
}

测试:

int a[10] = {7,3,2,9,8,5,1,10,4,6};
int len = 10; QuickSort* quicksort= new QuickSort(a, len);
quicksort->sort();
printArray(a, len, "QuickSort");

运行截图:


参考资料:

《算法导论 2rd》

快速排序算法

排序算法(1) 快速排序 C++实现的更多相关文章

  1. Java常见排序算法之快速排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  2. 常用排序算法之——快速排序(C语言+VC6.0平台)

    经典排序算法中快速排序具有较好的效率,但其实现思路相对较难理解. #include<stdio.h> int partition(int num[],int low,int high) / ...

  3. Python之排序算法:快速排序与冒泡排序

    Python之排序算法:快速排序与冒泡排序 转载请注明源地址:http://www.cnblogs.com/funnyzpc/p/7828610.html 入坑(简称IT)这一行也有些年头了,但自老师 ...

  4. Java排序算法之快速排序

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

  5. javascript高级排序算法之快速排序(快排)

    javascript高级排序算法之快速排序(快排)我们之前讨论了javascript基本排序算法 冒泡排序 选择排序 插入排序 简单复习: 冒泡排序: 比较相邻的两个元素,如果前一个比后一个大,则交换 ...

  6. javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法)

    javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法) 一.快速排序算法 /* * 这个函数首先检查数组的长度是否为0.如果是,那么这个数组就不需要任何排序,函数直接返回. * ...

  7. 排序算法之快速排序Java实现

    排序算法之快速排序 舞蹈演示排序: 冒泡排序: http://t.cn/hrf58M 希尔排序:http://t.cn/hrosvb  选择排序:http://t.cn/hros6e  插入排序:ht ...

  8. Python实现排序算法之快速排序

    Python实现排序算法:快速排序.冒泡排序.插入排序.选择排序.堆排序.归并排序和希尔排序 Python实现快速排序 原理 首先选取任意一个数据(通常选取数组的第一个数)作为关键数据,然后将所有比它 ...

  9. 基础排序算法之快速排序(Quick Sort)

    快速排序(Quick Sort)同样是使用了分治法的思想,相比于其他的排序方法,它所用到的空间更少,因为其可以实现原地排序.同时如果随机选取中心枢(pivot),它也是一个随机算法.最重要的是,快速排 ...

  10. C++编程练习(16)----“排序算法 之 快速排序“

    快速排序 基本思想: 通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的. 算法介绍: 设要排序的 ...

随机推荐

  1. Spark Launcher

  2. 深度学习(十六) ReLU为什么比Sigmoid效果好

    sigmoid: Relu: 为什么通常Relu比sigmoid和tanh强,有什么不同?主要是因为它们gradient特性不同. 1.sigmoid和tanh的gradient在饱和区域非常平缓,接 ...

  3. angular2自学笔记(二)---路由、服务等八大主要构造块

    angular的思想:总是把数据访问工作委托给一个支持性服务类. Angular 应用的:用 Angular 扩展语法编写 HTML 模板, 用组件类管理这些模板,用服务添加应用逻辑, 用模块打包发布 ...

  4. IOS贝塞尔曲线圆形进度条和加载动画

    做项目让做一个加载动画,一个圈圈在转中间加一个图片,网上有好多demo,这里我也自己写了一个,中间的图片可加可不加.其中主要用到贝塞尔曲线.UIBezierPath是对CGContextRef的进一步 ...

  5. JS获取当前屏幕宽高

    Javascript: 网页可见区域宽: document.body.clientWidth网页可见区域高: document.body.clientHeight网页可见区域宽: document.b ...

  6. Winform截图小程序

    今天闲时做的一个Demo,做得并不好,只是实现了最基本的截图功能 主要的思路就是 先打开一个主窗体,点击"截图按钮" 会出现一个半透明的小窗体(可以拉伸放大缩小) 然后利用Grap ...

  7. Hadoop源码学习笔记(3) ——初览DataNode及学习线程

    Hadoop源码学习笔记(3) ——初览DataNode及学习线程 进入了main函数,我们走出了第一步,接下来看看再怎么走: public class DataNode extends Config ...

  8. [编程] C语言的二级指针

    用C语言指针作为函数返回值:C语言允许函数的返回值是一个指针(地址),我们将这样的函数称为指针函数函数运行结束后会销毁在它内部定义的所有局部数据 #include<stdio.h> #in ...

  9. 一:SpringCloud

    一:前提知识+相关说明 前提知识:springmvc+spring/springboot+mybatis+maven+git...... cloud技术的五大神兽: 面试题: 什么是微服务? 微服务之 ...

  10. java设计模式-----5、原型模式

    原型(Prototype)模式是一种对象创建型模式,他采取复制原型对象的方法来创建对象的实例.使用原型模式创建的实例,具有与原型一样的数据. 原型模式的特点: 1.由原型对象自身创建目标对象.也就是说 ...