码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-09-18 13:21:02      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:nbsp   wap   turn   效率   ==   err   数组   笔试   exce   

  快速排序由于排序效率在同为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;
}
 

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

标签:nbsp   wap   turn   效率   ==   err   数组   笔试   exce   

原文地址:http://www.cnblogs.com/DHUtoBUAA/p/7542425.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!