我正在尝试使用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]);
}
}
}
答案 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
拨打DisplayArray
,DisplayArray
拨打BubbleSort
。
这意味着每当您想要打印数组时,您都必须对其进行冒泡排序。这被认为是不好的做法,因为它减少了调用函数有用的次数。一个更有用的功能是显示数组,但不会调用BubbleSort
或以任何方式修改数组。
您的问题并没有详细说明您希望如何冒泡排序,但此处的功能并未实现BubbleSort算法。通常,在将其应用于2-D数组等奇怪的情况之前,最好确保understand the algorithm。我在下面列出了一个工作示例,希望能帮助您走上正确的道路。
简而言之,请注意冒泡排序中有两个循环: *一个内部循环,贯穿数组并交换相邻元素 *一个外部循环,它运行内部循环,直到整个数组被排序
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;
}