注册 登录
编程论坛 C++教室

quicksort排序的时间复杂度是多少啊?

a99875984 发布于 2013-03-23 15:59, 2382 次点击
如题,谢谢了
12 回复
#2
qunxingw2013-03-23 17:08
平均O(nlogn),最坏n平方
#3
peach54602013-03-23 17:14
n * log(n)
#4
a998759842013-03-23 18:23
回复 2楼 qunxingw
程序代码:
#include <iostream>
using namespace std;

int main()
{
    int a[10],b[100]={0},c[100];//a储存原数组,b存储排序后数组,c存储个数
    int n,i,j;
    int min,max;
    cin>>n;
    for(i=0;i<n;i++)
        cin>>a[i];
    min=a[0];
    max=a[0];
    for(i=1;i<n;i++)//得到数组中的最小值和最大值
    {
        if(a[i]<min)
            min=a[i];
        if(a[i]>max)
            max=a[i];
    }
    b[0]=min;
    c[0]=0;
    for(i=1;i<n+1;i++)//排序思路:找到最小值,把比最小值大N的数存到B[N]中
    {
        c[i]=1;//保证B数值里每个非0值最少有一个输出
        j=a[i-1]-b[0];
        if(b[j]==a[i-1])
        {
            b[j]=a[i-1];
            c[j]++;//如果有多个相同的非零值,着个数加一
        }
        b[j]=a[i-1];
    }
    for(i=0;i<=max-min+1;i++)
    {
        if(b[i]!=0)
            while(c[i]>0)
            {
                cout<<b[i]<<" ";
                c[i]--;
            }
        else
            continue;
    }
    return 0;
}
我觉得这个排序可以使时间复杂度为N,就是空间复杂度可能会很大,所以可以帮我看下怎么储存会好点吗?谢谢了
#5
a998759842013-03-23 18:24
回复 3楼 peach5460
#include <iostream>
using namespace std;

int main()
{
    int a[10],b[100]={0},c[100];//a储存原数组,b存储排序后数组,c存储个数
    int n,i,j;
    int min,max;
    cin>>n;
    for(i=0;i<n;i++)
        cin>>a[i];
    min=a[0];
    max=a[0];
    for(i=1;i<n;i++)//得到数组中的最小值和最大值
    {
        if(a[i]<min)
            min=a[i];
        if(a[i]>max)
            max=a[i];
    }
    b[0]=min;
    c[0]=0;
    for(i=1;i<n+1;i++)//排序思路:找到最小值,把比最小值大N的数存到B[N]中
    {
        c[i]=1;//保证B数值里每个非0值最少有一个输出
        j=a[i-1]-b[0];
        if(b[j]==a[i-1])
        {
            b[j]=a[i-1];
            c[j]++;//如果有多个相同的非零值,着个数加一
        }
        b[j]=a[i-1];
    }
    for(i=0;i<=max-min+1;i++)
    {
        if(b[i]!=0)
            while(c[i]>0)
            {
                cout<<b[i]<<" ";
                c[i]--;
            }
        else
            continue;
    }
    return 0;
}
我觉得这个排序可以使时间复杂度为N,就是空间复杂度可能会很大,所以可以帮我看下怎么储存会好点吗?
#6
peach54602013-03-23 18:48
以下是引用a99875984在2013-3-23 18:24:05的发言:

#include
using namespace std;

int main()
{
    int a[10],b[100]={0},c[100];//a储存原数组,b存储排序后数组,c存储个数
    int n,i,j;
    int min,max;
    cin>>n;
    for(i=0;i
为什么要自己排呢,用STL呀
#7
peach54602013-03-23 18:50
简单看了一下,我个人认为你的算法不适用,想法不错
#8
a998759842013-03-23 18:58
回复 7楼 peach5460
为何不适合?
#9
a998759842013-03-23 20:26
回复 7楼 peach5460
我觉得这个算法理论上的时间复杂度比快速排序的时间复杂度要少的多,就是空间复杂度有点高,改进后完全可以代替快速排序啊
#10
peach54602013-03-23 20:54
n * log(n) 和 n
哪个时间复杂度高?
#11
peach54602013-03-23 20:57
以下是引用a99875984在2013-3-23 18:58:38的发言:

为何不适合?

1,你找不准空间分配原则
比如说最大最小值跨度是1-10000
但是我只有10个数
你根本找不准分配多大的空间去存
如果空间分配不合适就意味着你需要频繁的移动内存,算法效率自然下来了

2,你觉得CPU快还是内存IO块?
#12
peach54602013-03-23 21:04
http://blog.
搜了半天才搜到这个图
#13
a998759842013-03-23 22:53
回复 12楼 peach5460
谢谢了
1