繁体   English   中英

Bubblesort二维数组-C

[英]Bubblesort a 2-D Array - C

我试图将Bubblesort用于2D数组,并使用自定义大小的2D数组,最大限制为[100] [2]。 我是一个初学者,所以我不太擅长正确设置代码格式,所以散光会很棒。

我的输入

How many items of data do you wish to enter? 4
Please enter in the X coordinate: 4
Please enter in the Y coordinate: 4
Please enter in the X coordinate: 3
Please enter in the Y coordinate: 3
Please enter in the X coordinate: 2
Please enter in the Y coordinate: 2
Please enter in the X coordinate: 1
Please enter in the Y coordinate: 1

这样就可以打印出您希望从自定义数组输入中输入的数字。

输出(旨在比较每个数组并切换到升序)。

Printing in Ascending Order:
[4][3]
[3][3]
[3][3]

它打印3个数组而不是4个,并且不打印我输入的任何数字。 因此,有人能对此有所启发吗? 特别是Bubblesort函数。

int main()
{
    int arrayHeight, array[100][2];
    printf ("***** Bubble Sort ***** \n"); 
    InputArray(array, arrayHeight);
}

int InputArray(int array[100][2], int arrayHeight, int swap) 
{
    int i, xCoord, yCoord;
    printf("\n How many items of data do you wish to enter? ");
    scanf("%d",&arrayHeight);
    for(i=0; i<arrayHeight; i++)
    {
        printf("Please enter in the X coordinate: ");
        scanf("%d", &xCoord);
        printf("Please enter in the Y coordinate: ");
        scanf("%d", &yCoord);
        array[i][0] = xCoord;/* Name of XCoordinate and position within Array*/
        array[i][1] = yCoord;/*Name of YCoordinate and position within Array*/
    }
    DisplayArray(array, arrayHeight);
}

int DisplayArray(int array[100][2], int arrayHeight, int swap) 
{
    int i, j;
    printf("\n The 2-D Array contains : \n");
    for(i=0; i<arrayHeight; i++)
    {
        printf("[%d][%d]\n\r", array[i][1], array[i][0]);
    }
    BubbleSort(array, arrayHeight);
} 

int BubbleSort(int array[100][2], int arrayHeight)
{   
    int swap, i, j, k;
    printf("\n Printing in Asending Order: ");
    for (i = 0; i <arrayHeight-1; i++) 
    {
        if (array[i][0] > array[i][1 + 1]) 
        {
            array[1][i] = array[1][0+1];
            swap = array[1][i];
            array[i][1 + 1];
            printf("\n [%d][%d] ", array[i][0], array[1][i]);       
        }
    }
}

我不了解您要使用BubbleSort函数做什么。

但是只是为了正确处理一些事情:

if (array[i][0] > array[i][1 + 1]) 

这不起作用,您的数组已初始化为“ int array [100] [2]”。 按照惯例,应该在第二个方括号中的最高数字是1。(顺便说一下,1 + 1 = 2)

array[1][i] = array[1][0+1];
swap = array[1][i];

C是按顺序执行代码的,因此即使在将原始值保存到'swap'变量中之前,array [1] [i]也会被array [1] [0 + 1]覆盖。

array[i][1 + 1];

这行代码似乎没有执行任何操作。

如果您可以判断是要按元素还是按行(即按2D数组中的每个数组)进行排序,也许我们可以帮助您正确地解决问题。

这里发生了很多事情。

你的问题

由于您从BubbleSort调用printf的方式,您的程序正在打印出数组的奇怪部分。 BubbleSort仍在运行时,您的数组未完全排序。 但是,该函数在每次尝试交换数组元素后都会调用printf 如果要在排序后打印整个数组,最好让排序功能运行到完成,然后再完整打印出数组。

其他的东西

我想提出许多与您的问题相关的观点,以从样式和正确性的角度帮助您。 另外,其中一些非常有趣。

#include陈述

编译此代码时,您应该会收到几个警告。 如果您使用的是gcc ,则这些警告之一将类似于:

main.c: warning: incompatible implicit declaration of built-in function ‘printf’
    printf ("***** Bubble Sort ***** \n");

这说明函数printf在调用时已隐式声明。 也就是说,编译器推断出函数printf存在,因为您调用了一个名为printf 问题在于,除了可能存在之外,它对该功能一无所知。 这意味着编译器不知道该函数应该返回什么或该函数接受什么参数,因此如果使用不当,它将无法为您提供帮助。 为避免此问题,您应在程序中包括标准的C Input / Output标头,如下所示:

#include <stdio.h>

除了printf之外, stdio.h头文件还包含许多功能。 请查看man 3 stdio以获得更多信息。

在调用它们之前定义或声明函数

C的较不现代的方面之一是它从上到下贯穿您的程序。 许多现代语言允许您将函数声明放在代码中的任何位置,然后它可以自行完成工作。 Java语言的变量和函数提升就是一个例子。

因为C不会这样做,所以您应该在调用函数之前定义或声明函数。 如果您在没有声明或定义的情况下调用它们,则编译器将退回到默认的函数签名extern int <function_name>(); 也就是说,如果您不为函数提供声明或定义,则C将假定该函数在其他位置定义,返回一个int,并接受未指定数量的参数。

在此程序中,函数DisplayArray由三个参数定义:

int DisplayArray(int array[100][2], int arrayHeight, int swap);

但是,仅使用两个参数来调用它:

DisplayArray(array, arrayHeight);

之所以会发生这种情况,是因为第一次调用该函数时尚未定义该函数,因此,编译器在不了解任何更好的情况下会假定调用正确。

更正此错误(将定义放在第一个调用的上方)后,编译器将引发错误,指出函数DisplayArray接受三个参数,但仅使用两个参数进行调用。

调用函数/程序结构

在代码中创建函数最常被提及的好处是模块化。 这样的想法是,您可以在知道程序代码的用途的同时,在程序的不同位置自由地重用代码。 该程序通过创建一种功能链(每个功能调用另一个功能)而牺牲了这种好处。 InputArray调用DisplayArray ,而DisplayArray调用BubbleSort

这意味着任何时候只要您想打印一个数组,就必须对其进行气泡排序也可以。 这被认为是不好的做法,因为它减少了调用函数的时间。 一个更有用的函数是显示数组但不调用BubbleSort或以任何方式修改数组的BubbleSort

气泡排序

您的问题并未确切说明您要如何进行冒泡排序,但此处的函数未实现BubbleSort算法。 通常,最好先确保您了解算法,然后再将其应用于二维数组之类的奇怪情况。 我在下面提供了一个有效的示例,希望它可以帮助您走上正确的道路。

简要地,请注意,冒泡排序中有两个循环:*一个遍历数组并交换相邻元素的内部循环*一个运行该内部循环直到对整个数组进行排序的外部循环

小事

  • C程序通常更喜欢snake_case CamelCase ,但是更一般而言,您应该做最适合自己的事情。 如果您在团队中,请使用与该团队一致的风格。
  • 该程序中的所有函数都返回int ,但实际上没有一个函数使用return语句或返回有用的值。 如果您的函数没有返回有用的值,则返回void (例如void DisplayArray(int array[100][2], int arrayHeight) )。
  • 您的displayArray函数交换xy的位置。 除非另有说明,否则printf将按照您指定的顺序显示参数。 查看man 3 printf以获得更多关于该功能的信息。

工作实例

#include <stdio.h>

void DisplayArray(int array[100][2], int arrayHeight)
{
  int i, j;
  printf("\n The 2-D Array contains : \n");
  for(i=0; i<arrayHeight; i++)
  {
    printf("[%d][%d]\n\r", array[i][0], array[i][1]);
  }
}

void BubbleSort(int array[100][2], int arrayHeight)
{
  int i;
  int swap[2];
  int swapHappened = 1;

  // the outer loop runs until no swaps need to be made
  // no swapping implies the array is fully sorted
  while (swapHappened) {
    swapHappened = 0;

    // the inner loop swaps neighboring elements
    // this is what 'bubbles' elements to the ends of the array
    for (i = 0; i < arrayHeight-1; i++)
    {
      if ((array[i][0] > array[i+1][0]) ||
          (array[i][0] == array[i+1][0]) && (array[i][1] > array[i+1][1]))
      {
        // if a swap happens, the array isn't sorted yet, set this variable
        // so the `while` loop continues sorting
        swapHappened = 1;

        // save the higher-value row to a swap variable
        swap[0] = array[i][0];
        swap[1] = array[i][1];

        // push the lower-valued row down one row
        array[i][0] = array[i+1][0];
        array[i][1] = array[i+1][1];

        // put the saved, higher-value row where the lower-valued one was
        array[i+1][0] = swap[0];
        array[i+1][1] = swap[1];
      }
    }
    DisplayArray(array, arrayHeight);
  }
}

int main()
{
  int arrayHeight, array[100][2];
  printf ("***** Bubble Sort ***** \n");

  int i, xCoord, yCoord;

  printf("\n How many items of data do you wish to enter? ");
  scanf("%d",&arrayHeight);
  for(i=0; i<arrayHeight; i++)
  {
    printf("Please enter in the X coordinate: ");
    scanf("%d", &xCoord);
    printf("Please enter in the Y coordinate: ");
    scanf("%d", &yCoord);
    array[i][0] = xCoord;/* Name of XCoordinate and position within Array*/
    array[i][1] = yCoord;/*Name of YCoordinate and position within Array*/
  }

  DisplayArray(array, arrayHeight);
  BubbleSort(array, arrayHeight);
  DisplayArray(array, arrayHeight);
  return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM