我有一个难题。我目前正在尝试创建用户定义的函数,以对我在主函数中创建并填充的2D int数组的列(以升序排列)进行排序。我感觉自己接近了,但是由于某种原因最终输出不正确,它为最终值提供了一个甚至不在数组中的数字。从提供的值和编译花费的额外几秒钟来看,我认为我在代码中的某个时候弄乱了边界/超出了边界,但是我一直在努力奋斗数小时而徒劳无功而且我觉得新鲜的(也许是更有经验的)眼睛会有些用处。我仍在编程的“入门”课程中,因此鼓励我改写一个明显的错误,因为本周四的决赛是我的结社,并且对所有指针/技巧都表示赞赏。干杯!
#include <iostream>
using namespace std;
void sort2D(int arr[3][5], int rows, int columns) //the problem child
{
int userCol;
cout<<"Please enter the number of the column you'd like to sort: "<<endl;
cin>>userCol; //ask for appropriate column
for (int row_index=0; row_index<rows; row_index++) //start with first row and continue for all values in code
{
int temp;
if ((arr[row_index][userCol-1]<arr[row_index+1][userCol-1]))//if first value of selected column is less than next value
{
temp = arr[row_index+1][userCol-1];//create copy of second value
arr[row_index+1][userCol-1]=arr[row_index][userCol-1]; //replace second value with first value
arr[row_index][userCol-1]=temp;//set first equal to second's original value
}
}
for(int i=0; i<rows; i++)//print that shiz
{
for(int j=0; j<columns; j++)
{
cout<<arr[i][j]<<" ";
}
cout<<endl;
}
}
int main()
{
const int rows = 3;
const int columns = 5;
int arr[rows][columns];
for (int row_index=0; row_index<rows; row_index++)
{
for (int column_index=0; column_index<columns; column_index++)
{
arr[row_index][column_index] = (50+rand()%51);
cout << arr[row_index][column_index]<<" ";
}
cout << endl;
}
findMaxandIndex(arr, rows, columns);//i left my code for this out because it's working and isn't utilized in the problem code
cout << endl;
sort2D(arr, rows, columns);
return 0;
答案 0 :(得分:0)
问题1:您在int arr[3][5];
中声明的sort2D()
与您在arr[rows][columns];
中声明的int main()
不同。
课程:检查“通过引用传递”和“按值传递”。为简单起见,我建议按值传递。
问题2:排序仅比较2个值并且只运行1次。.因此{2,1,4,3}可能会排序为{1,2,3,4}但{1,4,3 ,2}仅经过1遍才能到达{1,3,2,4}。 @ZDF注释对此部分很有帮助。
问题3:在此行。temp = arr[row_index+1][userCol-1];
当row_index为2时,它将引用不在arr [] []数组中的位置。仅为row = 0,1,2 ..而不是3定义arr(当row_index为2时,row_index + 1为3)。这可能会回答:
它为最终值提供了一个甚至不在数组中的数字。
解决方案。我建议您看看并尝试..并分享您坚持的地方。您也可以在作为单独功能进行操作之前在main函数中测试sort2D。恕我直言,您可以从1开始寻找适用的排序算法(使用示例数据)。然后在该项目中继续使其工作。 (:
p / s:我不认为我的帖子是答案。更像是更正指南。
答案 1 :(得分:0)
您的排序功能非常接近气泡排序,它是要理解和实现的最简单的排序算法之一。稍作修改,您的代码即可运行:
void sort2D(int arr[3][5], int rows, int columns) //the problem child
{
//input userCol ...
//sorting start here ...
bool found = true; //we can quit the loop if the array is already sorted.
for (int bubble = 0; bubble < rows-1 && found ; bubble++)
{
found = false;
for (int row_index=0; row_index < rows - bubble - 1; row_index++)
{
int temp;
if ((arr[row_index][userCol-1] < arr[row_index+1][userCol-1]))//if first value of selected column is less than next value
{
//swap two elements.
temp = arr[row_index+1][userCol-1];//create copy of second value
arr[row_index+1][userCol-1]=arr[row_index][userCol-1]; //replace second value with first value
arr[row_index][userCol-1]=temp;//set first equal to second's original value
found = true; //we found something, continue to sort.
}
}
}
//print out the result ...
}
从C ++开始时,建议尽可能使用C ++工具:std::vector
用于数组,std::qsort
用于元素排序。