快速排序算法分析--C++版

  快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试喜欢考这个。

快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。

***********************************

分治法的基本思想:

  1.先从数列中取出一个数作为基准数。

  2.分区过程:将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。

  3.再对左右区间重复 (不含基准数),直到各区间只有一个数。

***********************************

效率分析:

  快速排序的时间主要耗费在划分操作上,对长度为k的区间进行划分,共需k-1次关键字的比较。

  最坏情况是每次划分选取的基准都是当前无序区中关键字最小(或最大)的记录,划分的结果是基准左边的子区间为空(或右边的子区间为空),而划分所得的另一个非空的子区间中记录数目,仅仅比划分前的无序区中记录个数减少一个。时间复杂度为O(n*n)

  在最好情况下,每次划分所取的基准都是当前无序区的"中值"记录,划分的结果是基准的左、右两个无序子区间的长度大致相等。总的关键字比较次数:O(nlgn)

  尽管快速排序的最坏时间为O(n*n),但就平均性能而言,它是基于关键字比较的内部排序算法中速度最快者,快速排序亦因此而得名。它的平均时间复杂度为O(nlgn)。

  快排空间复杂度:在通常情况下为O(log2n),需要使用深O(log2n)的栈实现递归,如果是最坏情况的话,很显然就要O(n)的空间了。

***********************************

应用场景:

  快排算法一般应用在排序中,但是分治法的思想应用广泛,比如在《剑指Offer》中, 题40:最小的k个数和题39:数组中出现次数超过一半的数字均用到了分治法的思想。

**********************************

C++实现代码:

#include<stdlib.h>
#include<exception>
#include<stdexcept>
using namespace std;

// Random Partition
int RandomInRange(int min,int max)
{
    int random=rand()%(max-min+1)+min;
    return random;
}

// 两个数交换
void Swap(int* num1,int* num2)
{
    int temp=*num1;
    *num1=*num2;
    *num2=temp;
}

int Partition(int data[],int length,int start,int end)
{
    logic_error ex("Invalid Parameters");
    if(data==nullptr || length<=0 || start<0 || end>=length)
        throw exception(ex);

    int index=RandomInRange(start,end);
    Swap(&data[end],&data[index]);

    int small=start-1;
    for(index=start;index<end;++index)
    {
        if(data[index]<data[end])
	{
	    ++small;
	    if(small!=index)
	        Swap(&data[index],&data[small]);
	}
    }
    ++small;
    Swap(&data[small],&data[end]);
    return small;
}
时间: 2024-10-12 21:02:13

快速排序算法分析--C++版的相关文章

快速排序 与 随机快速排序 算法分析

快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来. 快速排序的优点: (1)原址排序,空间复杂度较小. (2)虽然最坏情况下(有序数组)时间复杂度为 (n*n),但是平均性能很好,期望复杂度为( nlg(n) ). 快速排序使用分治法(Divid

学习记录:数据结构与算法分析c++版

数据结构与算法分析c++版 学习记录 一.绪论 1.数据结构的必要性 计算机程序被设计出来的目的不仅仅是为了计算,同时其也要完成数据的提取和检索任务,并尽可能地高效快速.在这个意义下,数据结构和算法分析作为程序的核心,就显得尤为重要.如何利用数据结构和算法,设计出简单易懂,并且高效地利用计算机资源的程序是这门课的核心议题. Def    一个算法被称为有效的(effective),如果其能在计算机的资源限制下解决相应问题:这些限制通常包括计算机储存量限制,以及算法运行的时间限制.    算法的消

快速排序算法分析

关于快速排序算法,由于其有着很好的平均时间复杂度而得到了广泛的应用. 快排的思想:每次从数组中取出一个元素出来,然后将该元素放置到一个合适的位置,使得该元素前面的数都小于或等于该元素,其后面的数都大于或等于该元素.然后在对该元素左右两边的数组进行同样的操作,直到左右两边的元素为空. 比如:有数组:5 3 8 2 6. 取出一个数5, 然后将数组中小于或等于5的数放到5的左边,大于等于5的数放到其右边,然后得到:2 3 5 8 6. 然后在对5左右两边的子数组再进行排序. 根据以上分析,那么通过什

经典排序算法之快速排序(C语言版)

快速排序是一种很常用的排序算法. /*  * 快速排序(伪算法) 2016-04-20 23:34:16  * 1.先找到第一个元素的最终位置  * 2.对第一个元素的最终位置之前的元素,进行快速排序.  * 3.对第一个元素的最终位置之后的元素,进行快速排序.  * */ extern void QuickSort(int a[],int low,int high);//第二个参数表示第一个元素的下标,第三个参数表示最后一个元素的下标 extern int FindPos(int a[], i

快速排序(Java版)

package com.love.test; import java.util.Scanner; /** * @author huowolf *快速排序实现 *快排是十分优秀的排序算法. *核心:分治法(1.选基元2.分区3.递归子列) */ public class QuickSort { public static void quickSort(int[] arr,int start ,int end) { if(start<end) { int i=start, j=end, x=arr[

数据结构与算法分析Java版pdf

下载地址:网盘下载 本书是国外数据结构与算法分析方面的经典教材,使用卓越的Java编程语言作为实现工具讨论了数据结构(组织大量数据的方法)和算法分析(对算法运行时间的估计).本书把算法分析与最有效率的Java程序的开发有机地结合起来,深入分析每种算法,内容全面.缜密严格,并细致讲解精心构造程序的方法. 原文地址:https://www.cnblogs.com/longgg/p/8419233.html

快速排序算法分析解析

快速排序算法的时间复杂度和各次标准数据元素的值关系很大.如果每次选取的标准元素都能均分两个子数组的长度,这样的快速排序过程是一个完全二叉树结构.(即每个结点都把当前数组分成两个大小相等的数组结点,n个元素数组的根结点的分解次数就构成一棵完全二叉树).这时分解次数等于完全二叉树的深度log2n;每次快速排序过程无论把数组怎样划分.全部的比较次数都接近于n-1次,所以最好情况下快速排序算法的时间复杂度为O(nlog2n):快速排序算法的最坏情况是数据元素已全部有序,此时数据元素数组的根结点的分需次数

数据机构与算法分析c++版

1.3 编写一个输出任意double类型的数值(可以使负数,只能用I/O的printDigit) #include <iostream> using namespace std; void printInt(int a) { if(a >= 10) printInt(a / 10); cout<<(a%10); } void printReal(double a) { while(!(a > -0.0000001 && a < 0.000001))

数据结构 编程实战 汇总———数据结构与算法分析第二版(C)

优先队列实现事件模拟 :http://maozj.iteye.com/blog/676567 d堆 左式堆 斜堆: http://blog.csdn.net/yangtrees/article/details/8252760 二项队列:http://www.cnblogs.com/xing901022/archive/2012/09/23/2699130.html (C++) http://blog.csdn.net/changyuanchn/article/details/14648463 (