Bubblesort二维阵列 - C.

时间:2018-04-12 21:59:04

标签: c bubble-sort

我正在尝试使用Bubblesort作为二维数组,使用自定义大小的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]);       
        }
    }
}

2 个答案:

答案 0 :(得分:0)

我没有得到你想用BubbleSort功能做的事情。

但只是为了得到一些正确的事情:

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

这不应该工作,你的数组被初始化为&#34; int array [100] [2]&#34;。通常,第二个方括号中应该是最高的数字是1.(顺便说一下,1 + 1 = 2)

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

C以顺序方式执行代码,因此即使在原始值保存在“交换”之前,数组[1] [i]也会被数组[1] [0 + 1]覆盖。变量

array[i][1 + 1];

这行代码似乎没有做任何事情。

如果您可以判断您是否正在尝试按元素排序&#39;或者通过&#39; line&#39; (即通过2D数组中的每个数组),也许我们可以帮助您正确处理问题。

答案 1 :(得分:0)

这里有相当多的事情发生。

您的问题

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

其他东西

我想提出一些与你的问题相关的要点,以帮助你从风格和正确的角度出发。此外,其中一些相当有趣。

#include语句

编译时,你应该收到几个警告。如果您使用gcc,其中一个警告将是:

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

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

#include <stdio.h>

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

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

C的一个不太现代的方面是它从上到下贯穿你的程序。许多现代语言允许您将函数声明放在代码中的任何位置,然后它可以自行处理。 Javascript的variable and function hoisting就是一个例子。

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

在这个程序中,函数DisplayArray定义了三个参数:

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

但是,只用两个参数调用它:

DisplayArray(array, arrayHeight);

这种情况只会发生,因为首次调用函数时,尚未定义函数,因此编译器在不知情的情况下会假定调用是正确的。

当这个被更正时(定义被置于第一次调用之上),编译器将抛出一个错误,指出函数DisplayArray有三个参数,但只用两个参数调用。

调用函数/程序结构

在代码中创建函数的最常见的好处是模块化。这是一个想法,你可以在程序中的不同点自由地重用代码,同时知道代码将要做什么。该程序通过创建一种函数链来牺牲这种好处,其中每个函数都调用另一个函数。 InputArray拨打DisplayArrayDisplayArray拨打BubbleSort

这意味着每当您想要打印数组时,您都必须对其进行冒泡排序。这被认为是不好的做法,因为它减少了调用函数有用的次数。一个更有用的功能是显示数组,但不会调用BubbleSort或以任何方式修改数组。

冒泡排序

您的问题并没有详细说明您希望如何冒泡排序,但此处的功能并未实现BubbleSort算法。通常,在将其应用于2-D数组等奇怪的情况之前,最好确保understand the algorithm。我在下面列出了一个工作示例,希望能帮助您走上正确的道路。

简而言之,请注意冒泡排序中有两个循环: *一个内部循环,贯穿数组并交换相邻元素 *一个外部循环,它运行内部循环,直到整个数组被排序

次要事情

  • C程序通常更喜欢snake_caseCamelCase,但更一般地说,您应该做最适合您的事情。如果您在团队中,请使用与该团队一致的样式。
  • 此程序中的所有函数都返回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;
}