你知道为什么快速排序的时间复杂度是n*lg(n)吗?

//你知道为什么快速排序的时间复杂度是nlgn吗?

//我们将数组当作完全二叉数来看的话,放在小堆中,

//每个节点排序需要o(h),也就是h次,h是完全相应节点的二叉树高度,

//N为总共节点数,排好一个节点需要o(h)次,那么排好N个节点呢?下面:

//且2^h=N-1(完全二叉树性质);

//—>h=log2(N);当有N个节点需要排序是就是N*lg(N),

//得到快速排序的时间复杂度是N*log2(N),这里的2我们当作e,所以

//得到快排的时间复杂度是N*lg(N),其实从堆开始想就可以得到结果.

#include <iostream>
using namespace std;

template<typename T>
class Trist
{
    public:
        typedef T type_value;
};

template<typename T,int _N>
class MinHeap
{
    private:
    typedef typename Trist<T> :: type_value type_value;
    public:
    MinHeap(int m_data[])
    {
        data = new type_value[_N];
        for(int i=0;i<_N;i++)
        {
            data[i] = m_data[i];
        }
        size = _N;
        int n = _N/2;
        while(n>=0)
        {
            StartSort(n,data);
            n--;
        }
    }
    void StartSort(int n,T *data)
    {
        int i = n;
        int j = 2*i+1;
        int temp;
        while(j<size)
        {
                if(j+1<size && data[j]>data[j+1])
                    j=j+1;
                if(data[i]>data[j])
                {
                    temp = data[i];
                    data[i] = data[j];
                    data[j] = temp;
                }
                i=j;
                j=2*i+1;
        }
    }
    T GetTop()
    {
        int temp = data[0];
        data[0]=data[size-1];
        size--;
        StartSort(0,data);
        return temp;
    }

    void Show()
    {
        for(int i=0;i<size;i++)
        {
            cout<<data[i]<<"  ";
        }
        cout<<endl;
    }
    private:
    T *data;
    int size;
};
int main()
{
    int a[]={8,6,5,3,4,2,5,1};
    MinHeap<int,8> mh(a);
    mh.Show();
    cout<<mh.GetTop()<<endl;
    mh.Show();
    return 0;
}

时间: 2024-10-22 14:08:54

你知道为什么快速排序的时间复杂度是n*lg(n)吗?的相关文章

快速排序[平均时间复杂度O(NlogN)]

基本思想: 假设我们现在对"6 1 2 7 9 3 4 5 10 8"这10个数进行排序.首先在这个序列中随便找一个数作为基准数.为了方便,就让第一个数6作为基准数.分别从初始序列"6 1 2 7 9 3 4 5 10 8"两端开始"探测".先从右往左找一个小于6的数,再从左往右找一个大于6的数,然后交换它们,用两个变量i和j分别指向最左边和最右边,直到i=j,将基准数与a[i]交换,再继续递归对两测进行一样的方式. 快速排序的每一轮处理其实就是

使用JAVA直观感受快速排序与冒泡排序的性能差异

初学算法,肯定会编写排序算法 其中两个最为有名的就是冒泡排序和快速排序 理论上冒泡排序的时间复杂度为O(N^2),快速排序的时间复杂度为O(NlogN) 下面本门使用JAVA,分别编写三段排序程序 对十万个0-9999的整数进行一次冒泡排序 对十万个0-9999的整数进行1000次快速排序,使用递归完成 对十万个0-9999的整数进行1000次快速排序,使用堆栈完成 对十万个0-9999的整数进行一次冒泡排序: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

排序和顺序统计学(2)——快速排序

快排我接触的也比较多了,从之前NOIP的时候算法老师讲的版本,到之前数据结构课上学习的版本,到现在<算法导论>里讲的版本,我个人并不能不能区别它们的好坏,权且都写出来,以后再来区别.三种实现方式如下: noip: void qsort1(int *a,int l,int r){ int i,j,mid,temp; i=l;j=r;mid=a[(i+j)/2]; while(i<=j) { while(a[i]<mid) i++; while(a[j]>mid) j--; if

再说快速排序

快速排序作为排序算法中的战斗机,一直是排序算法里面用的最多也是考的最多的一个算法 已经证明,对n个元素进行排序,最优的算法也是需要NLogN的时间复杂度,而快速排序的时间复杂度就是NlogN, 所以快速排序是排序算法中最优算法中的一个,下面我们继续来探索一下神奇的快速排序算法吧 快速排序的核心思想:每次排序把每一个元素k移动到正确的位置,并且把小于k的元素都移动到k的左边,大于k的元素都移动到k的右边 待排序的数列x[],长度为n 算法一:初始化k=x[m](m为待排序的第一个元素),对于每一个

快速排序——PowerShell版

继续读啊哈磊算法有感系列,继续升华.上一篇是冒泡排序,在结尾总结了一下冒泡排序的缺点——时间复杂度O(N*N)太大.这一篇来说一下快速排序,快速排序可以在多数情况下克服冒泡排序的缺点(最坏的情况下和冒泡排序的时间复杂度一样).下面我们先来说说快速排序的思想与过程,与上一篇从过程到思想的思考方式不同,这一次我们的思考过程是从思想到过程—— 快速排序的思想: 利用二分的思想,先在待排序子数组中选定一个基准数(作为中间值).一个左初始位(待排序子数组的左端点位.若对整个数组进行排序,则左端点位为数组的

排序算法五:随机化快速排序(Randomized quicksort)

上一篇提到,快速排序的平均时间复杂度是O(nlgn),比其他相同时间复杂度的堆排序.归并排序都要快,但这是有前提的,就是假定要排序的序列是随机分布的,而不是有序的.实际上,对于已经排好的序列,如果用快速排序时间复杂度是O(n2).为应对这样的有序序列,于是出现了本篇要讲的随机化快速排序(Randomized quicksort). 快速排序在选主元(pivot)时,总是选择第一个:随机化快速排序的思想是,随机从序列中选择一个作为主元. (一)算法实现 1 protected void quick

快速排序(js版本)

快速排序的时间复杂度为:O(n*log2n),相比较其他O(n2)的排序算法,还是比较有优势的.原文参考在此处,因为本人对原文的一小段代码有点不理解,所以进行了小的修改. 1.基本思想:在数组的第一个或最后一个元素里选择一个,作为基准元素,也称中轴.通过排序,让中轴把数组分为俩部分,一部分比中轴小,一部分大.再用递归法同样的排序俩部分. 2.实例: 3.js代码 var arrayQuick = [7,9,4,8,2,24,54,12,32,11,2]; quick(arrayQuick,0,a

算法研究之快速排序

快 速排序(Quicksort)是对冒泡排序的一种改进.由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然 后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 以上摘自百度百科. 最坏时间复杂度: O(n二次方); 最好时间复杂度: O(n); 快速排序的基本思想 1.分解: 在D[i...j...n]的数据中,找一个基准点D[j],

插入排序、冒泡排序、选择排序、希尔排序、快速排序、归并排序、堆排序和LST基数排序——C++实现

首先是算法实现文件Sort.h,代码如下: /* * 实现了八个常用的排序算法:插入排序.冒泡排序.选择排序.希尔排序 * 以及快速排序.归并排序.堆排序和LST基数排序 * @author gkh178 */ #include <iostream> template<class T> void swap_value(T &a, T &b) { T temp = a; a = b; b = temp; } //插入排序:时间复杂度o(n^2) template<