[英]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算法。 通常,最好先确保您了解算法,然后再将其应用于二维数组之类的奇怪情况。 我在下面提供了一个有效的示例,希望它可以帮助您走上正确的道路。
简要地,请注意,冒泡排序中有两个循环:*一个遍历数组并交换相邻元素的内部循环*一个运行该内部循环直到对整个数组进行排序的外部循环
snake_case
CamelCase
,但是更一般而言,您应该做最适合自己的事情。 如果您在团队中,请使用与该团队一致的风格。 int
,但实际上没有一个函数使用return
语句或返回有用的值。 如果您的函数没有返回有用的值,则返回void
(例如void DisplayArray(int array[100][2], int arrayHeight)
)。 displayArray
函数交换x
和y
的位置。 除非另有说明,否则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.