| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 553 人关注过本帖
标题:急!!!有码神在吗?帮忙看看这段代码哪里出错了
只看楼主 加入收藏
vc银翘片
Rank: 1
等 级:新手上路
帖 子:8
专家分:2
注 册:2012-3-2
结帖率:0
收藏
已结贴  问题点数:20 回复次数:4 
急!!!有码神在吗?帮忙看看这段代码哪里出错了
程序代码:
#include<stdio.h>
#include<stdlib.h>
//#include<list>
#include <math.h>
#define L 8           //排序元素个数
#define FALSE 0
#define TRUE 1
//using namespace std; 

typedef struct RecTypes
{
    int key;
}RecType;
RecType R[L];
int num;
int sum;
int sun;             //定义排序趟数的全局变量
void Bubblesort();
void Quicksort(int low,int high);
void Insertsort();
void Shellsort();
void Selectsort();
void Heap();
void Merge(int low,int mm,int high,int *x,int *y);
void Mergesort(); //二路归并排序
//主函数
int main()
{
    RecType S[L+1];
    //Seqlist S;
    int i,k;
    char ch1,ch2,q;
    printf("\n\t\t              ★排序算法实现与演示系统★\n\n\t\t请输入%d个待排序的数据:",L);
    for(i=1;i<=L;i++)
    {
        scanf("%d",&S[i].key);
        getchar();
        printf("\t\t");
    }
    ch1='y';
    while(ch1=='y')
    { 
        printf("\n");
        printf("\n\t\t                   排序算法                  \n");
        printf("\n\t\t***********************************************\n");
        printf("\n\t\t  1--------直接插入排序     \n");
        printf("\n\t\t  2--------希尔排序        \n");
        printf("\n\t\t  3--------冒泡排序       \n");
        printf("\n\t\t  4--------快速排序        \n");
        printf("\n\t\t  5--------直接选择排序         \n");
        printf("\n\t\t  6--------堆排序         \n");
        printf("\n\t\t  7--------归并排序        \n");
        printf("\n\t\t  0--------退出             \n");
        printf("\n\t\t***********************************************\n");
        printf("\n\t\t请选择排序算法进行演示:");
        scanf("%c",&ch2);
        getchar();
        for(i=1;i<=L;i++)
        {
            R[i].key=S[i].key;
        }
        switch(ch2)
        {
          
            case '1':
                Insertsort();
                break;
            case '2':
                Shellsort();
                break;
            case '3':
                Bubblesort();
                break;
            case '4':
                printf("\n\t\t原始数据为:\n\t\t");
                for(k=1;k<=L;k++)
                {
                    printf("%5d",R[k].key);
                }
              
                printf("\n");
                num=0;sun=0;sum=0;
                Quicksort(0,L);
                printf("\n\t\t排序最终结果是:\n\t\t");
                for(k=0;k<=L;k++)
                {
                    printf("%5d",R[k].key);
                }
                printf("\n\t\t比较次数是:%d\n\t\t",sum);
                printf("\n\t\t交换次数是:%d\n\t\t",sun);
                break;
            case '5':
                Selectsort();
                break;
            case '6':
                Heap();
                break;
            case '7':
                Mergesort();
                break;
            case '0':
                ch1='n';
                break;
            default:
            system("cls");//清屏
            printf("\n\t\t对不起,您输入有误,请重新输入!\n");
            break;
        }
        if(ch2!='0')
        {
            if(ch2=='2'||ch2=='3'||ch2=='4'||ch2=='5'||ch2=='6'||ch2=='7'||ch2=='8')
            {
                printf("\n\n\t\t排序完毕!");
                printf("\n\t\t按回车键继续!");
                q=getchar();
                if(q!='\n')
                {
                  
                    ch1='n';
                }
            }
        }
    }
    return 1;
}
void Bubblesort()
{
    int i,j,k,x=0,y=0,m=0;
    int exchange=TRUE;//标志位exchange初始化为TRUE 1
    printf("\n\t\t原始数据为:\n\t\t");
    for(k=1;k<=L;k++)
    {
        printf("%5d",R[k].key);
    }
    printf("\n");
    for(i=1;i<L&&exchange==TRUE;i++)//外层对总的循环次数执行次数
    {
        exchange=FALSE;
        for(j=1;j<=L+1-i;j++) //内层相邻记录的交换与比较
        {
            m++;//比较次数++
            if(R[j].key<R[j-1].key)
            {
            R[0].key=R[j].key;
            R[j].key=R[j-1].key;
            R[j-1].key=R[0].key;
            exchange=TRUE;
            y++;//移动次数++
        }
    }
    m--;//比较次数
    if(exchange)                 //输出语句
    {
        printf("\t\t第%d趟冒泡排序的结果为:\n\t\t",i);
        for(k=1;k<=L;k++)
        {
            printf("%5d",R[k].key);
        }
      
        printf("\n");
    }
    }
    printf("\n\t\t比较次数是:\t\t");
    printf("%d",m);
    printf("\n\t\t移动次数是:\t\t");
    printf("%d",y);
    printf("\n\t\t排序最终结果是:\n\t\t");
    for(i=1;i<=L;i++)
    {
        printf("%5d",R[i].key);
    }
}
void Quicksort(int low,int high)//该程序为快速算法实现
{
    int i=low,j=high,k;
    R[0].key=R[low].key;
    while(i<j)
    {
        while(i<j&&R[0].key<=R[j].key)  //右侧扫描
        {
            j--;
            sum++;
        }
        if(i<j)
        {
            R[i].key=R[j].key;//交换
            i++;
            sun++;
        }
        while(i<j&&R[i].key<R[0].key)//左侧扫描
        {
            i++;
            sum++;
        }
        if(i<j)
        {
            R[j].key=R[i].key;//交换
            j--;
            sun++;
        }
    }
    R[i].key=R[0].key;
    num++;
    //输出语句包括排序的结果及次数
    printf("\t\t第%d趟快速排序的结果为:\n\t\t",num);
    for(k=0;k<=L;k++)
    {
        printf("%5d",R[k].key);
    }
  
    printf("\n");
    if(low<i-1)  Quicksort(low,i-1);//递归部分(左侧)
    if(j+1<high) Quicksort(j+1,high);//递归部分(右侧)
}
void Insertsort()
{
    int i,j,k,m=0,x=0;  //初始化比较次数变量m,移动次数变量x
    printf("\n\t\t原始数据为:\n\t\t");
    for(k=1;k<=L;k++)
    {
        printf("%5d",R[k].key);
    }
    printf("\n");
    //主要运行部分
    for(i=2;i<=L;i++)
    {
        if(R[i].key<R[i-1].key)
        {
            R[0]=R[i];
            j=i-1;
            while(R[0].key<R[j].key)
            {
                R[j+1]=R[j];
                j--;
            }
            R[j+1]=R[0];
            x++;
        }
        m++;
        //输出语句包括排序的结果及次数
        printf("\t\t第%d趟直接插入排序的结果为:\n\t\t",m);
        for(k=1;k<=L;k++)
        {
            printf("%5d",R[k].key);
        }
      
        printf("\n");
    }
    printf("\n");
    printf("\n\t\t比较次数是:\t\t");
    printf("%d",m);
    printf("\n\t\t移动次数是:\t\t");
    printf("%d",x);
    printf("\n\t\t排序最终结果是:\n\t\t");
    for(i=1;i<=L;i++)
    {
        printf("%5d",R[i].key);
    }
}
void Shellsort()
{
    int i,j,gap,x,k,y=0,m=0;   //初始化比较次数变量m,移动次数变量y
    printf("\n\t\t原始数据为:\n\t\t");
    for(k=1;k<=L;k++)
    {
        printf("%5d",R[k].key);
    }
    printf("\n");
    //函数主要部分
    gap=L/2;
    while(gap>0)
    {
        for(i=gap+1;i<=L;i++)
        {
            j=i-gap;
            while(j>0)
            {
                if(R[j].key>R[j+gap].key)
                {
                    x=R[j].key;//交换语句
                    R[j].key=R[j+gap].key;
                    R[j+gap].key=x;
                    j=j-gap;
                    y++;//移动次数++
                }
                else
                {
                    j=0;
                }
            }
        }
        gap=gap/2;
        m++;//比较次数++
        //输出语句包括排序的结果及次数
        printf("\t\t第%d趟希尔排序的结果为:\n\t\t",m);
        for(k=1;k<=L;k++)
        {
            printf("%5d",R[k].key);
        }
      
        printf("\n");
    }
    printf("\n\t\t比较次数是:\t\t");
    printf("%d",m);
    printf("\n\t\t移动次数是:\t\t");
    printf("%d",y);
    printf("\n\t\t排序最终结果是:\n\t\t");
    for(i=1;i<=L;i++)
    {
        printf("%5d",R[i].key);
    }
    printf("\n");
}

void Selectsort()
{
    int i,j,k,h,x=0,y=0;
    printf("\n\t\t原始数据为:\n\t\t");
    for(k=1;k<=L;k++)
    {
        printf("%5d",R[k].key);
    }
  
    printf("\n");
    for(i=1;i<L;i++)
    {
        h=i;
        for(j=i+1;j<=L;j++)
        {
            x++;                        //比较次数
            if(R[j].key<R[h].key)
            {
                h=j;                       //确定最小值
            }
        }
        if(h!=i)
        {
            R[0].key=R[i].key;
            R[i].key=R[h].key;
            R[h].key=R[0].key;
            y++;                       //移动次数
        }
        printf("\t\t第%d趟选择排序的结果为:\n\t\t",i);
        for(k=1;k<=L;k++)
        {
            printf("%5d",R[k].key);
        }
  
        printf("\n");
    }
    //输出语句包括排序的结果及次数
    printf("\n\t\t比较次数:%d",x);
    printf("\n\t\t移动次数:%d",y);
    printf("\n\t\t排序最终结果是:\n\t\t");
    for(i=1;i<=L;i++)
    {
        printf("%5d",R[i].key);
    }
    printf("\n");
}

void Merge(int low,int mm,int high,int *x,int *y)//两个有序序列的合并
{
    int i=low,j=mm+1,p=0;
    RecType *R1;   //i对第一个开始到结尾,j从第二个开始到结尾
    R1=new RecType[high-low+1];
    if(!R1)
    {
        printf("内存不足!");
    }
    while(i<=mm&&j<=high)//两序列从起始位置开始将小的元素放入到R1中
    {
        R1[p++]=(R[i].key<=R[j].key)?R[i++]:R[j++];
        (*x)++;
        (*y)++;
    }
    while(i<=mm)//第二段结束,剩余放入R1中
    {
        R1[p++]=R[i++];
        (*y)++;
    }
    while(j<=high)//第二段剩余,剩余放入R1中
    {
        R1[p++]=R[j++];
        (*y)++;
    }
    for(p=0,i=low;i<=high;p++,i++)//剩余元素放入R1中,赋予R
    {
        R[i]=R1[p];
        (*y)++;
    }
}
void MergePass(int length,int *x,int *y)//一次二路归并排序
{
    int i;
    for(i=1;i+2*length-1<=L;i=i+2*length)
    {
        Merge(i,i+length-1,i+2*length-1,x,y); //函数调用
    }
    if(i+length-1<L)
    {
        Merge(i,i+length-1,L,x,y);  //函数调用
    }
}
//归并排序
void Mergesort() //二路归并排序
{
    int length,k,m=0,i,x=0,y=0;
    printf("\n\t\t原始数据为:\n\t\t");
    for(k=1;k<=L;k++)
    {
        printf("%5d",R[k].key);
    }
  
    printf("\n");
    for(length=1;length<L;length*=2)
    {
        MergePass(length,&x,&y);
        m++; //输出语句包括排序的结果及次数
        printf("\t\t第%d趟归并排序的结果为:\n\t\t",m);
        for(k=1;k<=L;k++)
        {
            printf("%5d",R[k].key);
        }
  
        printf("\n");
    }
    printf("\n\t\t排序最终结果是:\n\t\t");
    for(i=1;i<=L;i++)
    {
        printf("%5d",R[i].key);
    }
    printf("\n");
    printf("\t\t比较次数:%d\n",x);
    printf("\t\t移动次数:%d\n",y);
}
void CreateHeap(int root,int index,int *x,int *y)
{
    int j,temp,finish;
    j=2*root;                            //j指向左孩子
    temp=R[root].key;
    finish=0;
    while(j<=index&&finish==0)
    {
        if(j<index)
        {
            if(R[j].key<R[j+1].key)
            {
                j++;
            }
        }                                   //指向较大的孩子
        if(temp>=R[j].key)
        {
            finish=1;
        }
        else
        {
            R[j/2].key=R[j].key;
            (*y)++;
            j=j*2;
        }
        *x = *x+2;
    }
    R[j/2].key=temp;
    (*y)++;
}
//堆排序
void Heapsort()
{
    int i,j,temp,k,x=0,y=0;
    for(i=(L/2);i>=1;i--)   //建立初始堆
    {
        CreateHeap(i,L,&x,&y);
    }
    x=0;
    y=0;
    for(i=L-1,k=1;i>=1;i--,k++)  //将堆中根节点和最后一个节点交换
    {
        temp=R[i+1].key;
        R[i+1].key=R[1].key;
        R[1].key=temp;
        CreateHeap(1,i,&x,&y);
        printf("\t\t第%d趟堆排序的结果为:\n\t\t",k);
        for(j=1;j<=L;j++)
        {
            printf("%5d",R[j].key);
        }
  
        printf("\n");
    }
    printf("\n\t\t比较次数是:%d\t\t",x);
    printf("\n\t\t移动次数是:%d\t\t",y);
}
void Heap()
{
    int i;
    printf("\n\t\t原始数据为:\n\t\t");
    for(i=1;i<=L;i++)
    {
        printf("%5d",R[i].key);
    }
    printf("\n");
    Heapsort();
    printf("\n\t\t排序最终结果是:\n\t\t");
    for(i=1;i<=L;i++)
    {
        printf("%5d",R[i].key);
    }
    printf("\n");
}
搜索更多相关主题的帖子: include 
2012-12-07 09:32
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:5 
是编译错误
还是运行错误 ,如果是后者  那就只能自己调试了

DO IT YOURSELF !
2012-12-07 11:30
crystall
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:184
专家分:809
注 册:2012-12-1
收藏
得分:5 
我测试了一下,正常运行啊, 不过快排的结果不正确.
2012-12-07 11:47
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
收藏
得分:5 
for(i=1;i<=L;i++)
    {
        scanf("%d",&S[i].key);
        getchar();
        printf("\t\t");
    }

感觉这会不会怪怪得啊

        for(i=1;i<=L;i++)
        {
            R[i].key=S[i].key;
        }
这会不会越界啊

[ 本帖最后由 草狼 于 2012-12-7 11:51 编辑 ]
2012-12-07 11:48
ren1375342
Rank: 2
等 级:论坛游民
帖 子:33
专家分:46
注 册:2012-12-4
收藏
得分:5 
printf("\n");
                num=0;sun=0;sum=0;
                Quicksort(0,L);\\                      应该最低位是1吧
                printf("\n\t\t排序最终结果是:\n\t\t");
                for(k=0;k<=L;k++)
                {
还有就是这一块 if(i<j)
        {
            R[i].key=R[j].key;//交换不能这么交换
            i++;
            sun++;

如果您想找一份编写软件的工作, 则首先您应该能够回答 "是" 的一个问题就是:"请问,您会使用c吗?"
2012-12-07 16:28
快速回复:急!!!有码神在吗?帮忙看看这段代码哪里出错了
数据加载中...
 
   



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

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