鱼C论坛

 找回密码
 立即注册
查看: 3945|回复: 3

求大佬帮忙,我实在是不知道哪里错了

[复制链接]
发表于 2017-12-20 21:36:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
写了生成随机数,再用直接插入排序和希尔排序,在查找。但是我第一个插入排序实在不知道哪里不对,无法排序。还有查找元素位置也是不对,返回的i,一直是数组长度。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void create(int *a,int n)
{        int i;

        srand((unsigned)time(NULL));
        for(i = 1; i < n; i ++)
        {
                a[i] = rand()%100;
        printf("%4d",a[i]);
        }
printf("\n");

}
/*void insertSort(int *b, int n)
{
        int i, j;
        for(i = 1; i <= n; i ++ )
        {
                b[0] = b[i];
                for(j = j -1; b[0] < b[j]; j --)
                        b[j + 1] = b[j];
            b[j+1] = b[0];
    }

}*/
//直接插入排序
/*
void insertSort(int *b, int n)
{
    int i, j, k;

    for (i = 1; i < n; i++)
    {
        //为a[i]在前面的a[0...i-1]有序区间中找一个合适的位置
        for (j = i - 1; j >= 0; j--)
            if (b[j] < b[i])
                break;

        //如找到了一个合适的位置
        if (j != i - 1)
        {
            //将比a[i]大的数据向后移
            int temp = b[i];
            for (k = i - 1; k > j; k--)
                b[k + 1] = b[k];
            //将a[i]放到正确位置上
            b[k + 1] = temp;
        }
    }
}*/
//希尔排序
void ShellSort(int *b, int n)
{
    int i , j;
    int d;
    for(d = n - 1  / 2; d >= 1; d = d / 2)
    {
        for(i = d + 1; i <= n - 1; i ++)
        {
            b[0] = b[i];
            for(j = i - d; j > 0 && b[0] < b[j]; j = j - d)
                b[j + d] = b[j];
            b[j + d] = b[0];

        }
    }
}
//顺序查找
int SeqSearch1(int *b, int n, int k)
{
    int i;
    b[0] = k;
    i = n ;
    while(b[i] != k)
      {
              i--;
      }  
    return i;
}
int main()
{
        int a[100];
        int b[100];
        int n , i, k,h;
        scanf("%d", &n);
        create(a, n);
        for(i = 1; i < n; i++)
        {
                b[i] = a [i];
        }
//        insertSort(b, n);
        ShellSort(b, n);
        for(i = 1; i < n ; i ++)
        {
                printf("%4d", b[i]);
        }
        printf("输入一个你需要查找的成绩:");
        scanf("%d", &k);
        SeqSearch1(b, n, k);

        printf("它处于第%d位.", i);


return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-12-20 21:44:34 | 显示全部楼层
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void create(int *a,int n)
{        int i;

        srand((unsigned)time(NULL));
        for(i = 1; i < n + 1; i ++)
        {
                a[i] = rand()%100;
        printf("%4d",a[i]);
        }
printf("\n");

}
/*void insertSort(int *b, int n)
{
        int i, j;
        for(i = 1; i <= n; i ++ )
        {
                b[0] = b[i];
                for(j = j -1; b[0] < b[j]; j --)
                        b[j + 1] = b[j];
            b[j+1] = b[0];
    }

}*/
//直接插入排序
/*
void insertSort(int *b, int n)
{
    int i, j, k;

    for (i = 1; i < n; i++)
    {
        //为a[i]在前面的a[0...i-1]有序区间中找一个合适的位置
        for (j = i - 1; j >= 0; j--)
            if (b[j] < b[i])
                break;

        //如找到了一个合适的位置
        if (j != i - 1)
        {
            //将比a[i]大的数据向后移
            int temp = b[i];
            for (k = i - 1; k > j; k--)
                b[k + 1] = b[k];
            //将a[i]放到正确位置上
            b[k + 1] = temp;
        }
    }
}*/
//希尔排序
void ShellSort(int *b, int n)
{
    int i , j;
    int d;
    for(d = n   / 2; d >= 1; d = d / 2)
    {
        for(i = d + 1; i <= n - 1; i ++)
        {
            b[0] = b[i];
            for(j = i - d; j > 0 && b[0] < b[j]; j = j - d)
                b[j + d] = b[j];
            b[j + d] = b[0];

        }
    }
}
//顺序查找
int SeqSearch1(int *b, int n, int k)
{
    int i;
    b[0] = k;
    i = n  ;
    while(b[i] != k)
      {
              i--;
      }  
    return i;
}
int main()
{
        int a[100];
        int b[100];
        int n , i, k,h;
        scanf("%d", &n);
        create(a, n);
        for(i = 1; i < n + 1; i++)
        {
                b[i] = a [i];
        }
//        insertSort(b, n);
        ShellSort(b, n);
        for(i = 1; i < n+1 ; i ++)
        {
                printf("%4d", b[i]);
        }
        printf("输入一个你需要查找的成绩:");
        scanf("%d", &k);
        SeqSearch1(b, n, k);

        printf("它处于第%d位.", i);


return 0;
}这个是改后的代码,n和长度是相等的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-2 18:57:37 | 显示全部楼层
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void create(int *a,int n)
{        int i;

        srand((unsigned)time(NULL));
        for(i = 1; i < n + 1; i ++)
        {
                a[i] = rand()%100;
        printf("%4d",a[i]);
        }
printf("\n");

}
/*void insertSort(int *b, int n)
{
        int i, j;
        for(i = 1; i <= n; i ++ )
        {
                b[0] = b[i];
                for(j = j -1; b[0] < b[j]; j --)
                        b[j + 1] = b[j];
            b[j+1] = b[0];
    }

}*/
//直接插入排序
/*
void insertSort(int *b, int n)
{
    int i, j, k;

    for (i = 1; i < n; i++)
    {
        //为a[i]在前面的a[0...i-1]有序区间中找一个合适的位置
        for (j = i - 1; j >= 0; j--)
            if (b[j] < b[i])
                break;

        //如找到了一个合适的位置
        if (j != i - 1)
        {
            //将比a[i]大的数据向后移
            int temp = b[i];
            for (k = i - 1; k > j; k--)
                b[k + 1] = b[k];
            //将a[i]放到正确位置上
            b[k + 1] = temp;
        }
    }
}*/
//希尔排序
void ShellSort(int *b, int n)
{
    int i , j;
    int d;
    for(d = n   / 2; d >= 1; d = d / 2)
    {
        for(i = d + 1; i <= n - 1; i ++)
        {
            b[0] = b[i];
            for(j = i - d; j > 0 && b[0] < b[j]; j = j - d)
                b[j + d] = b[j];
            b[j + d] = b[0];

        }
    }
}
//顺序查找
int SeqSearch1(int *b, int n, int k)
{
    int i;
    b[0] = k;
    i = n  ;
    while(b[i] != k)
      {
              i--;
      }  
    return i;
}
int main()
{
        int a[100];
        int b[100];
        int n , i, k,h;
        scanf("%d", &n);
        create(a, n);
        for(i = 1; i < n + 1; i++)
        {
                b[i] = a [i];
        }
//        insertSort(b, n);
        ShellSort(b, n);
        for(i = 1; i < n+1 ; i ++)
        {
                printf("%4d", b[i]);
        }
        printf("输入一个你需要查找的成绩:");
        scanf("%d", &k);
        SeqSearch1(b, n, k);

        printf("它处于第%d位.", i);


return 0;
}这个是改后的代码,n和长度是相等的

@FishC
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-2 18:57:46 | 显示全部楼层
鱼C篮球 发表于 2024-01-02 18:57
#include
#include
#include
void create(int * ...


你好!我发现你的代码中存在一些错误。

首先,在create函数中,你使用了srand((unsigned)time(NULL))来设置随机数种子,但是你没有包含头文件<ctime>,导致编译出错。你可以在代码开头添加#include <ctime>来解决这个问题。

其次,在insertSort函数中,你定义了变量k,但是没有给它赋初值。你可以在函数开始前添加int k;来修复这个问题。

另外,insertSort函数的实现也有问题。你对i的赋值有误,应该是i = j + d,而不是i = d + 1,然后在for循环内添加 i -= d,来实现从右向左的查找插入位置。同时,你把找到插入位置之后的操作放在if语句的外面,应该将这部分代码放在if语句内部。你可以参考下面的示例代码进行修改:
void insertSort(int *b, int n)
{
    int i, j, k;
    for(i = 2; i <= n; i++)
    {
        if (b[i] < b[i - 1])
        {
            b[0] = b[i];
            for (j = i - 1; b[0] < b[j]; j -= 1)
                b[j + 1] = b[j];
            b[j + 1] = b[0];
        }
    }
}

最后,在SeqSearch1函数中,你在while循环里忘记给i减一,导致后面输出的i值不正确。你可以将while循环改为while(i > 0 && b[i] != k),并在循环内部添加i--,来修复这个问题。

除此之外,你的代码基本上是可以运行的。希望这些修改能够帮助到你!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 00:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表