1

给定集合二维整数。该数组由 5 行和 10 列组成。系统中的每个值都是 0 到 20 之间的随机数。必须编写一个程序来执行数组值的排序,如下所示:首先将每列中的值排列,以便它们按升序排序(从上到下) ),然后 - 因此可以通过比较同一行中不同列中的值对(“比较词典”)对“正确”的列进行排序:比较第一行中两列中的两个值,如果它们与第二行中的值相比是相同的,依此类推,并相应地更改列的顺序(参见下面数组第三次打印中的示例)。在紧急情况的两个阶段中的每个阶段之前和之后显示数组。例如 : 我的代码的示例和输出 我坚持对每个列进行排序。我没有得到我想要的排序。我想得到你的帮助。这是我的代码:

#include "stdio.h"
#include "conio.h"
#include "malloc.h"
#include "stdlib.h"

#define N 5
#define M 10
#define LOW 0
#define HIGH 20

void initRandomArray(int arr[N][M]);
void printArray(int arr[N][M]);
void SortInColumn(int arr[N][M],int m);
int main()
{
    int arr[N][M];
    int m;
    m=M;

    srand((unsigned)time(NULL)); //To clear the stack of Random Number
    initRandomArray(arr);
    printf("Before sorting:\n");
    printArray(arr);
    printf("Sorting elements in each column:\n");
    SortInColumn(arr,M);
    system("pause");
    return 0;
}
void initRandomArray(int arr[N][M])
{

    int i,j;
    for (i=0 ; i<N ; i++)
        for (j=0 ; j<M ; j++)
        {
         arr[i][j]=LOW+rand()%(HIGH-LOW+1);
        }

}
void printArray(int arr[N][M])
{ 
    int i,j;
    for (i=0 ; i<N ; i++)
    {
        for (j=0 ; j<M ; j++)
            printf("%d ", arr[i][j]);
         printf("\n");
    }
}
void SortInColumn(int arr[][M],int m)
{
    int i,j;
    int temp;
    for( i=m-1 ; i>=0 ; i--)
        {   
        for(j=0; j<N-1; j++)
            if (arr[i][j]>arr[i][j+1]) // compare adjacent item
                 {
                  temp=arr[i][j];
                  arr[i][j]=arr[i][j+1];
                  arr[i][j+1]=temp;
                 }
        }
        for (i=0 ; i<N ; i++)
        {
            for (j=0 ; j<M ; j++)
                printf("%d ", arr[i][j]);
             printf("\n");
        }
}
4

2 回答 2

0

这是我的,它运行并给出正确的答案。

基本上,你做错了两件事。

  • 你需要三个循环而不是两个。外循环围绕每一列循环。第二个循环确保您比较每一列 N-1 次,因为每次运行您都会在正确的位置获得一个项目。内部循环进行相邻比较。

  • arr[i][k]您需要将和之间的比较arr[i][k+1]更改arr[i][k]arr[i+1][k]。因为要在同一列中比较它们,所以保持值k(列)不变并更改行i

    void SortInColumn(int arr[][M],int m)
    {
        int i,j,k;
        int temp;
    
        for( k=0 ; k<m ; ++k)
        {
            for(j=0; j<N-1; j++)
            {
                    for(i=0; i < N-1 - j; i++)
                    {
                            if (arr[i][k]>arr[i+1][k]) // compare adjacent item
                            {
                                    temp=arr[i][k];
                                    arr[i][k]=arr[i+1][k];
                                    arr[i+1][k]=temp;
                            }
                    }
            }
        }
    }
    

顺便说一句,这个算法一般来说性能很差。您可能想尝试其他方法。

于 2013-09-18T15:05:09.053 回答
-1

让我们看看你的SortInColum功能。我更改了格式以更好地了解正在发生的事情,并重命名了一些变量。

void SortInColumn(int arr[][M],int m)
{
  int row,col;
  int temp;
  for( row=m-1 ; row>=0 ; row--) // foreach row
  {
    for(col=0; col<N-1; col++) { // foreach column
      if (arr[row][col]>arr[row][col+1]) { // comparing adjacent entries 
                                           //  in different cols? Why? 
        temp=arr[row][col];
        arr[row][col]=arr[row][col+1];
        arr[row][j+1]=temp;
      }
  }
  printArray(arr);

}

此函数(给定一些更改)将对单个列进行排序,然后您可以为每一列调用它。希望这能给你一个好的起点。

于 2013-09-18T14:53:31.870 回答