穷小疯 发表于 2019-12-23 22:24:46

排序算法的比较

利用随机函数产生 30000 个随机整数, 利用插入排序、 起泡排序、 选择排序、 快速排序、 堆排序、 归并排序等排序方法进行排序, 并统计每一种排序上机所花费的时间和次数。Status PrintfSqlist(int N,Sqlist L)                               
{
        int i;
       
        printf("数据个数:");//输出数据个数
        printf("%d\n",L.length);
       
        printf("排序后的数据:(从左向右依次增大)\n");//输出数据
        for(i=1;i<=N;i++)
                printf("%7.2d   ",L.r);
        printf("\n");
   


        return OK;
}

//***************************************************************
//                  直接插入排序
//***************************************************************
Status InsertSort(Sqlist &L)                        //参考书P265算法10.1               
{
        int i,j;

        if(L.length==0)
        {
                printf("要排序的数据为空!");
                return ERROR;
        }

        for(i=2;i<=L.length;i++)
        {
                if(L.r<L.r)//将L.r插入有序子表       
                {
                        L.r=L.r;//复制为监视哨
                        L.r=L.r;                                          
                        for(j=i-2;L.r<L.r;j--)
                        {
                                L.r=L.r;//记录后移
                        }
                       
                        L.r=L.r;//插入到正确位置
                }
        }
        return OK;
}

//***************************************************************
//                      折半插入排序
//***************************************************************
Status BInsertSort(Sqlist &L)                             //参考书P267算法10.2       
{
        int i,j,mid,low,high;

        if(L.length==0)
        {
                printf("要排序的数据为空!");
                return ERROR;
        }
       
        for(i=2;i<=L.length;i++)
        {
                L.r=L.r;//将L.r暂存在L.r
                low=1;
                high=i-1;
               
                while(low<=high)//在r中折半查找有序插入的位置
                {
                        mid=(low+high)/2;
                       
                        if(L.r<L.r)//插入点在低半区                     
                        {
                                high=mid-1;
                        }
                        else
                        {
                                low=mid+1;//插入点在高半区
                        }
                }//while
                for(j=i-1;j>=high+1;j--)//插入点后的数据后移                               
                {
                        L.r=L.r;                                                                                       
                }
                L.r=L.r;          //将数据插入
        }//for
        return OK;
}

/********************************************************************************
                              希尔排序
*********************************************************************************/
                                                                  //参考书P272算法10.4及10.5
/*Status ShellInsert(Sqlist &L,int dk)                        //希尔插入排序
{                       
        int i,j;                                                                                                                        //前后位置的增量是dk

        for(i=dk+1;i<=L.length;i++)                                                                                        //r只是暂存单元,不是哨兵,
        {                               
                if(L.r<L.r)                                                                                        //将L.r插入有序增量子表
                {
                        L.r=L.r;                                                                                                //暂存L.r

                        for(j=i-dk;j>0 && L.r<L.r;j-=dk)
                        {
                                L.r=L.r;                                                                                //记录后移,查找插入位置
                        }
                        L.r=L.r;                                                                                        //插入
                }
        }
        return OK;
}

Status ShellSort(Sqlist &L,int dlta,int t)      //希尔排序
{               
        int i;

        if(L.length==0)
        {
                printf("要排序的数据为空!");
                return ERROR;
        }

        for(i=0;i<t;i++)
        {
                ShellInsert(L,dlta);                                                        //一趟增量为dlta的插入排序
        }
        return OK;
}
*/

//**************************************************************
//                         起泡排序
//**************************************************************
Status BubbleSort(Sqlist &L)                               
{
        int i,j,t;

        if(L.length==0)
        {
                printf("要排序的数据为空!");
                return ERROR;
        }

       
        for(i=1;i<=L.length-1;i++)                                                                                       
        {
                for(j=1;j<=L.length-i;j++)
                {
                        if(L.r>L.r)       //前面的数据>后面数据时
                        {               
                                t=L.r;                                                                                               
                                L.r=L.r;
                                L.r=t;//将元素交换
                        }
                }
        }
        return OK;
}

//****************************************************
//                   快速排序
//****************************************************

int Partition(Sqlist &L, int low, int high) //交换顺序表中子表L.r的记录,使得枢轴记录到位,并返回其所在位置,此时在它之前(后)的记录均不大于它
{
        int pivotkey;//记录关键字
        L.r=L.r;//用子表的第一个纪录作枢轴纪录
        pivotkey=L.r;//用枢轴纪录关键字                              
        while (low<high)                                       
        {
                while(low<high && L.r>=pivotkey)
                {
                        high--;
                }
                L.r= L.r;//将比枢轴记录小的记录移到低端
                while(low<high && L.r<=pivotkey)
                {
                        low++;
                }
                L.r=L.r;//将比枢轴记录大的数移到高端
   }
   L.r=L.r;//枢轴记录到位
   return low;
}//Partition函数

void Qsort (Sqlist &L,int low, int high)
{
        int pivotloc;
        if(low<high)//长度大于1,可以进行                     
        {
                pivotloc=Partition(L, low ,high);
                Qsort(L,low,pivotloc-1);   //对低子表递归排序,pivotloc是枢轴位置
                Qsort(L,pivotloc+1,high);//对高子表递归排序
        }
}//Qsort函数

StatusQuickSort (Sqlist &L)
{
    if(L.length==0)
        {
                printf("要排序的数据为空!");
                return ERROR;
        }
        Qsort(L,1,L.length);
        return OK;
}//QuickSort



//**********************************************
//               选择排序
//**********************************************
Status ChooseSort(Sqlist &L)                                       
{
        int i,j,k,t;

        if(L.length==0)
        {
                printf("没有数据!");
                return ERROR;
        }
       
        for(i=1;i<=L.length;i++)//排序的趟数
        {
                k=i;
                for(j=i+1;j<=L.length;j++)//比较第i个元素以及其后的数据中最小的
                {
                        if(L.r<L.r)
                                k=j;
                }
               
                if(i!=j)//将最小数据赋值给L.r
                {
                        t=L.r;
                        L.r=L.r;
                        L.r=t;
                }
        }
        return OK;
}

//****************************************
//                  堆排序
//****************************************
Status HeapAdjust(Sqlist &L,int s,int m)//调整L.r的关键字,使L.r成大顶堆
{
        int i;                                                                                       
        L.r=L.r;

        for(i=2*s;i+1<=m;i*=2)//沿数据较大的孩子结点向下筛选
        {
                if(i<m && L.r<L.r)//i为数据较大的记录下标
                        i++;
               
                if(L.r>=L.r)//L.r插入在S位置上
                        break;
               
                L.r=L.r;
                s=i;
        }
        L.r=L.r;        //插入新数据        

        return OK;
}

Status HeapSort(Sqlist &L)//堆排序
{
        int i,t;

        if(L.length==0)
        {
                printf("没有数据!");
                return ERROR;
        }

        for(i=L.length/2;i>0;i--)
                HeapAdjust(L,i,L.length);
       
        for(i=L.length;i>1;i--)
        {
                t=L.r;//将堆顶记录和当前未经排序的子序列L.r中最后一个记录互换
                L.r=L.r;
                L.r=t;
               
                HeapAdjust(L,1,i-1);//将L.r重新调整为大顶堆
        }
        return OK;
}



//**************************************************
//                  基数排序
//**************************************************
typedef struct node{
        intkey;
        node *next;
}RecType;

Status         RadixSort(Sqlist L)       
{
        int t,i,j,k,d,n=1,m;
        RecType *p,*s,*q,*head,*tail;//定义各链队的首尾指针
       
        for(i=1;i<=L.length;i++)//将顺序表转化为链表
        {
                s=(RecType*)malloc(sizeof(RecType));
                s->key=L.r;
                if(i==1)//当为第一个元素时
                {
                        q=s;
                        p=s;
                        t++;
                }
                else               
                {
                        q->next=s;//将链表连接起来
                        q=s;
                        t++;
                }
                q->next=NULL;
        }
       
        d=1;                                                                                       
       
        while(n>0)   //将每个元素分配至各个链队
        {
                for(j=0;j<10;j++)//初始化各链队首、尾指针
                {
                        head = NULL;
                        tail = NULL;
                }
                while(p!=NULL)//对于原链表中的每个结点循环
                {
                        k=p->key/d;
                        k=k%10;
                        if(head==NULL)//进行分配
                        {
                                head=p;
                                tail=p;
                        }
                        else
                        {
                                tail->next=p;
                                tail=p;
                        }
                        p=p->next;//取下一个待排序的元素
                }
               
                p=NULL;//用于收集第一个元素时的判断
               
                for(j=0;j<10;j++)//对每一个链队循环, 搜集每一个元素
                {
                        if(head!=NULL)//进行搜集
                        {
                                if(p==NULL)                                               
                                {
                                        p=head;
                                        q=tail;
                                }
                                else
                                {
                                        q->next=head;
                                        q=tail;
                                }
                        }
                }
                q->next=NULL;//最后一个结点的next置为空
                d=d*10;
               
                n=0;
                m=1;
                while(m<=L.length)//判断当L中的元素都除d后是不是都为零了
                {
                        if((L.r/d)!=0)
                        {
                                n++;
                                m++;
                        }
                        else
                                m++;

                }
        }
       
        i=1;
        while(p!=NULL) //将链表转换为顺序表
        {
                L.r=p->key;
                i++;
                p=p->next;
        }
        return OK;
}
求助大佬运行结果就是   算法名称   排序次数   运行时间这种格式请大佬帮帮忙

Croper 发表于 2019-12-23 22:53:47

怎么看起来这么像作业呢?
作业就好好做,认真听了课的话这个肯定不难

穷小疯 发表于 2019-12-24 08:46:30

Croper 发表于 2019-12-23 22:53
怎么看起来这么像作业呢?
作业就好好做,认真听了课的话这个肯定不难

这是我的课程设计,换了几种方法都不能运行,所以才来问的

Croper 发表于 2019-12-25 07:42:18

那么你为什么不把你不能运行的代码放上来,让大家帮你检查一下哪儿不对呢?

大尾巴 发表于 2019-12-25 13:39:29

各位大神啊,排序方法那么多,是不是要求每种排序法都要精通啊?????

穷小疯 发表于 2019-12-25 17:42:31

Croper 发表于 2019-12-25 07:42
那么你为什么不把你不能运行的代码放上来,让大家帮你检查一下哪儿不对呢?

我重新发了一个帖子,能不能麻烦你去看看啊,我那里把代码发上去了
页: [1]
查看完整版本: 排序算法的比较