日暮日暮里 发表于 2017-12-20 21:36:45

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

写了生成随机数,再用直接插入排序和希尔排序,在查找。但是我第一个插入排序实在不知道哪里不对,无法排序。还有查找元素位置也是不对,返回的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 = rand()%100;
        printf("%4d",a);
        }
printf("\n");

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

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

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

      //如找到了一个合适的位置
      if (j != i - 1)
      {
            //将比a大的数据向后移
            int temp = b;
            for (k = i - 1; k > j; k--)
                b = b;
            //将a放到正确位置上
            b = 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 = b;
            for(j = i - d; j > 0 && b < b; j = j - d)
                b = b;
            b = b;

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

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


return 0;
}

日暮日暮里 发表于 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 = rand()%100;
        printf("%4d",a);
        }
printf("\n");

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

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

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

      //如找到了一个合适的位置
      if (j != i - 1)
      {
            //将比a大的数据向后移
            int temp = b;
            for (k = i - 1; k > j; k--)
                b = b;
            //将a放到正确位置上
            b = 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 = b;
            for(j = i - d; j > 0 && b < b; j = j - d)
                b = b;
            b = b;

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

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


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

鱼C篮球 发表于 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 = rand()%100;
      printf("%4d",a);
      }
printf("\n");

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

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

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

      //如找到了一个合适的位置
      if (j != i - 1)
      {
            //将比a大的数据向后移
            int temp = b;
            for (k = i - 1; k > j; k--)
                b = b;
            //将a放到正确位置上
            b = 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 = b;
            for(j = i - d; j > 0 && b < b; j = j - d)
                b = b;
            b = b;

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

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


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

@FishC

FishC 发表于 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 < b)
      {
            b = b;
            for (j = i - 1; b < b; j -= 1)
                b = b;
            b = b;
      }
    }
}

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 求大佬帮忙,我实在是不知道哪里错了