当前位置: 代码迷 >> C语言 >> 帮我看下
  详细解决方案

帮我看下

热度:280   发布时间:2008-05-10 11:30:27.0
是两边往中间排  不是冒泡..
----------------解决方案--------------------------------------------------------
还不是一样,冒泡的基本方法,从两端交替进行,复杂度不变,还是n^2…………
----------------解决方案--------------------------------------------------------
两个方法本质上不不一样的  排列出发点不一样 这方法更先进点
----------------解决方案--------------------------------------------------------
Bubblet1 Use time:23569ms
Bubblet2 Use time:15259ms
HeapSort Use time:15ms
请按任意键继续. . .


这是测试的数据,1是经典冒泡,2是你改进过的冒泡,3是堆排……
程序如下:
/********************************************************
** Highlight software by yzfy(雨中飞燕) http://yzfy.org *
*********************************************************/
#include <iostream>
#include <time.h>
using namespace std;

void Bubblet1(int *a,int len)
{
    for (int i=1;len--,i;)
    {
        for (int j=i=0;j<len;j++)
            if (a[j]>a[j+1])
                {int t=a[j];a[j]=a[j+1];a[j+1]=t;i=1;}
    }
}

void Bubblet2(int *a,int len)
{
    for (int i=1,j=len-1,k=0;!k;i++)
    {
        k=1;
        for (int l=i-1;l<j;l++)
            if (a[l]>a[l+1])
                {int t=a[l];a[l]=a[l+1];a[l+1]=t;k=0;}
        if (k)break;
        for (int l=--j;l>=i;l--)
            if (a[l-1]>a[l])
                {int t=a[l];a[l]=a[l-1];a[l-1]=t;k=0;}
    }
}

void AdjustHeap(int *a,int begin,int len)
{
    int child,x=a[begin];
    while(child=begin<<1|1,child<len)
    {
        if(child<len-1 && a[child]<a[child+1])child++;
        if(x<a[child]){a[begin]=a[child];begin=child;}else break;
    }
    a[begin]=x;
}

void HeapSort(int *a,int len)
{
    for(int i=len/2-1;i>=0;i--)
        AdjustHeap(a,i,len);
    while(len-->1)
    {
        int t=a[len];a[len]=a[0];a[0]=t;
        AdjustHeap(a,0,len);
    }
}

#define N 100000

int a[N];

int main()
{
    clock_t t;
    for (int i=0;i<N;i++)a[i]=rand();
    t=clock();
    Bubblet1(a,N);
    printf("Bubblet1 Use time:%ldms\n",clock()-t);

    for (int i=0;i<N;i++)a[i]=rand();
    t=clock();
    Bubblet2(a,N);
    printf("Bubblet2 Use time:%ldms\n",clock()-t);

    for (int i=0;i<N;i++)a[i]=rand();
    t=clock();
    HeapSort(a,N);
    printf("HeapSort Use time:%ldms\n",clock()-t);

}

----------------解决方案--------------------------------------------------------
不要在中间定义变量
.c不能运行的!

----------------解决方案--------------------------------------------------------
谢了!  看过了 很好  我写的那程序不知道还有什么地方有误 我机子上没VC  堆排的思路是什么
#include <iostream>
printf 也能用吗  没试过

[[it] 本帖最后由 走一圈 于 2008-5-10 14:14 编辑 [/it]]
----------------解决方案--------------------------------------------------------
Bubblet1 Use time:23951ms
Bubblet2 Use time:17710ms
HeapSort Use time:15ms
QuickSort Use time:7ms
请按任意键继续. . .

新的一轮测试结果。加入了快排。
C99正式支持在任意位置定义变量。如果你没有C99编译器,请用C++编译器代替。
我的所有代码,请都不要用TC编译……
附上源码:
/********************************************************
** Highlight software by yzfy(雨中飞燕) http://yzfy.org *
*********************************************************/
#include <iostream>
#include <time.h>
using namespace std;

void Bubblet1(int *a,int len)
{
    int i=1,j;
    while (len--,i)
    {
        for (j=i=0;j<len;j++)
            if (a[j]>a[j+1])
                {int t=a[j];a[j]=a[j+1];a[j+1]=t;i=1;}
    }
}

void Bubblet2(int *a,int len)
{
    for (int i=1,j=len-1,k=1;k;i++)
    {
        int l;k=0;
        for (l=i-1;l<j;l++)
            if (a[l]>a[l+1])
                {int t=a[l];a[l]=a[l+1];a[l+1]=t;k=1;}
        if (!k)break;
        for (l=--j;l>=i;l--)
            if (a[l-1]>a[l])
                {int t=a[l];a[l]=a[l-1];a[l-1]=t;k=1;}
    }
}

void AdjustHeap(int *a,int begin,int len)
{
    int child,x=a[begin];
    while (child=begin<<1|1,child<len)
    {
        if (child!=len-1 && a[child]<a[child+1])child++;
        if (x<a[child]){a[begin]=a[child];begin=child;}
        else break;
    }
    a[begin]=x;
}

void HeapSort(int *a,int len)
{
    for (int i=len/2-1;i>=0;i--)
        AdjustHeap(a,i,len);
    while (len-->1)
    {
        int t=a[len];a[len]=a[0];a[0]=t;
        AdjustHeap(a,0,len);
    }
}

int* Partition(int* begin,int* end)
{
    int x=*end;
    for (;begin<end;begin++)
        if (*begin > x) *end--=*begin;
    return *begin=x,begin;
}

void QuickSort(int* begin,int* end)
{
    if (begin < end)
    {
        int *p=Partition(begin,end);
        QuickSort(begin,p-1);
        QuickSort(p+1,end);
    }
}



#define N 100000

int a[N];

int main()
{
    clock_t t;
    srand((unsigned)time(NULL));

    for (int i=0;i<N;i++)a[i]=rand();
    t=clock();
    Bubblet1(a,N);
    printf("Bubblet1 Use time:%ldms\n",clock()-t);

    for (int i=0;i<N;i++)a[i]=rand();
    t=clock();
    Bubblet2(a,N);
    printf("Bubblet2 Use time:%ldms\n",clock()-t);

    for (int i=0;i<N;i++)a[i]=rand();
    t=clock();
    HeapSort(a,N);
    printf("HeapSort Use time:%ldms\n",clock()-t);

    for (int i=0;i<N;i++)a[i]=rand();
    t=clock();
    QuickSort(a,a+N-1);
    printf("QuickSort Use time:%ldms\n",clock()-t);
}

----------------解决方案--------------------------------------------------------
做大顶堆调整..然后和最后一个元素交换..这样刚好保证重小到大排列...这个应该快在交换时间比较小吧...
for(int i=len/2-1;i>=0;i--) AdjustHeap(a,i,len);
这个是做什么?建堆?
----------------解决方案--------------------------------------------------------
LS:回答正确……
----------------解决方案--------------------------------------------------------
Bubblet1 Use time:24209ms
Bubblet2 Use time:16138ms
SelectSort Use time:9888ms
HeapSort Use time:17ms
QuickSort Use time:6ms
请按任意键继续. . .


你看,连选择排序都比你的快。等我写完了插入排序,就把代码一起发上来……
----------------解决方案--------------------------------------------------------
  相关解决方案