| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1405 人关注过本帖
标题:关于各个排序算法的问题,我是想生成随机数然后计算排序时间,请问哪里出错了
取消只看楼主 加入收藏
九亿少女的梦
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2017-4-9
结帖率:66.67%
收藏
 问题点数:0 回复次数:0 
关于各个排序算法的问题,我是想生成随机数然后计算排序时间,请问哪里出错了
请问快速排序哪里有问题


程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<time.h>


#define size 3000
typedef int KeyType;
typedef int InfoType;
typedef struct{
    KeyType key;
    InfoType otherinfo;
}RecType;
typedef struct{
    RecType r[size+1]; 
}SeqList;

void InsertSort(SeqList L){
    int i,j;

    for (i=2;i<=size;++i) 
     
        if (L.r[i].key<L.r[i-1].key) // L.r[i]与有序表的最后一个元素比较,若L.r[i]较小则插入有序子表内,若较大则保持当前位置   
        { 
            L.r[0]= L.r[i];            //先将待插入的元素放入“哨兵”位置
            L.r[i]= L.r[i-1];         //子表最后一个元素开始后移一位      
            for (j=i-2;L.r[0].key<L.r[j].key; --j)     
                L.r[j+1]= L.r[j]; //从子表的后往前比较,只要元素比哨兵大就不断后移        
            L.r[j+1]= L.r[0];  //直到子表元素小于哨兵,将哨兵值送入当前要插入的位置(包括插入到表首)   
        } 
//        printf("\n输出的直插排序的序列为:\n");
//        for(i=1;i<=size;i++)
//            printf("%d  ",L.r[i].key);
//        printf("\n");
}
       
void BInsertSort(SeqList L){
    int i,j,low,high,mid;
    for(i=2;i<=size;++i){
        L.r[0]=L.r[i];
        low=1;high=i-1;
        while(low<=high){
            mid=(low+high)/2;
            if(L.r[i].key<L.r[mid].key)
                high=mid-1;
            else
                low=mid+1;
        }
        for(j=i-1;j>=high+1;--j)
            L.r[j+1]=L.r[j];
        L.r[high+1]=L.r[0];
    }
//    printf("\n输出的折半排序的序列为:\n");
//    for(i=1;i<=size;i++)
//        printf("%d  ",L.r[i].key);
//    printf("\n");

}



void ShellInsert(SeqList L,int n){
    int i,j,dk;
    for(dk=n/2;dk>0;dk/=2){//步长的选取    
        for(i=1+dk;i<=size;i++)
            if(L.r[i].key<L.r[i-dk].key){    
                L.r[0]=L.r[i];        
                for(j=i-dk;j>0&&(L.r[0].key<L.r[j].key);j-=dk)                
                    L.r[j+dk]=L.r[j];            
                L.r[j+dk]=L.r[0];
            }        
    }
    
//    printf("\n输出的希尔排序的序列为:\n");            
//    for(i=1;i<=size;i++)            
//        printf("%d  ",L.r[i].key);
//    printf("\n");

}


void BubbleSort(SeqList L){
    int i,j;
    int exchange=1;
    for(i=1;i<=size;i++){ //n-1趟
        exchange=0;
        for(j=1;j<=size-i;j++)//每次会选出一个最大值放在最后,因此每趟排序比较个数递减
            if(L.r[j].key>L.r[j+1].key){
                L.r[0]=L.r[j];L.r[j]=L.r[j+1];L.r[j+1]=L.r[0];
                exchange=1;
            }
            if (!exchange)    
                break;                    
    }
//    printf("\n输出的冒泡排序的序列为:\n");
//    for(i=1;i<=size;i++)
//        printf("%d  ",L.r[i].key);
//    printf("\n");

}

int Partition(SeqList &L,int low,int high){
    SeqList pivotkey;
    L.r[0]=L.r[low];
    pivotkey.r[0]=L.r[low];
    while(low<high){
        while(low<high&&L.r[high].key>=pivotkey.r[0].key) 
            --high;    
        L.r[low]=L.r[high];      
        while(low<high&&L.r[low].key<=pivotkey.r[0].key)  
            ++low;
        L.r[high]=L.r[low];
    } 
    L.r[low]=L.r[0];     //支点记录到位;
    return low;    //返回支点记录所在位置。
}

void QuickSort (SeqList &L,int low,int high){

    int pivot;
    if(low<high) 
    {                  
        pivot=Partition(L,low,high);    
        QuickSort(L,low,pivot-1);        
        QuickSort(L,pivot+1,high);
    }
}

void SelectSort(SeqList L)
{  
    int i,j,k;
    for(i=1;i<size;i++) {    //做第i趟排序(1≤i≤n-1)
        k=i;
        for(j=i+1;j<=size;j++)//在R[i..n]中选key最小的记录R[k]
            if(L.r[j].key<L.r[k].key)
                 k=j;  //k记下目前找到的最小关键字所在的位置
        if(k!=i)    //交换R[i]和R[k]
        {
            L.r[0]=L.r[i]; L.r[i]=L.r[k];L.r[k]=L.r[0]; 
        }         
    }
//    printf("\n输出的简单选择排序的序列为:\n");            
//    for(i=1;i<=size;i++)            
//        printf("%d  ",L.r[i].key);    
//    printf("\n");

}


void main(){
    SeqList p;
    int i;
    double start,end,duration;
    srand((unsigned)time(NULL));
    
    for(i=1;i<size+1;i++)
        p.r[i].key=rand()%100;
    
    start=clock(); 
    InsertSort(p);
    end=clock();
    duration=end-start;
    printf("\n直插排序运行时间为:%f",duration);

    start=clock();
    BInsertSort(p);
    end=clock();
    duration=end-start;
    printf("\n折半排序运行时间为:%f",duration);

    start=clock();
    ShellInsert(p,size);
    end=clock();
    duration=end-start;
    printf("\n希尔排序运行时间为:%f",duration);

    start=clock();
    BubbleSort(p);
    end=clock();
    duration=end-start;
    printf("\n冒泡排序运行时间为:%f",duration);

    start=clock();
    QuickSort(p,1,size);
    end=clock();
    duration=end-start;
    printf("\n快速排序运行时间为:%f",duration);
//    printf("\n输出的快速排序的序列为:\n");            
//    for(i=1;i<=size;i++)            
//        printf("%d  ",q.r[i].key);    
//    printf("\n");

    start=clock();
    SelectSort(p);
    end=clock();
    duration=end-start;
    printf("\n选择排序运行时间为:%f\n",duration);

}






[此贴子已经被作者于2017-5-3 18:13编辑过]

搜索更多相关主题的帖子: size int key for printf 
2017-05-03 18:02
快速回复:关于各个排序算法的问题,我是想生成随机数然后计算排序时间,请问哪里出 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032737 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved