执行选择排序2D字符阵列

时间:2014-01-24 01:05:00

标签: c arrays sorting

我目前有一个2D char数组大小:[5] [256]。

数组可以包含数字或字母。 我的任务是使用选择排序将字符串按升序排序。

我的想法是将每一行转换为ASCII,然后按升序对值进行排序,然后转换回字符。

我已经为另一个任务实现了2D数组选择排序,但是,它在这里不起作用,因为我将它编码为使用2列而不是像这里的256(不知道如何更改它)。

我需要帮助的是如何为每一行使用ASCII值并在选择排序中使用它。

现在试图解决这个问题好几个小时,让我精神抖..

感谢任何帮助。

我不一定会找人为我编码一切,更多的是朝着正确的方向发展。我是C的新手,并不知道C可以做的每一项功能。

以下是我目前的完整代码:

#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
char    arc5Strings[5][256];
int nCount, nCount2, nCount3, nCount4, nCount5, nCount6, nCount7;


int fMinVal[1][2] = {1,1};
int nMinValPosition;
int nMoves;
int nRow;
int fTemp[1][2] = {1,1};
int fTemp2[1][2] = {1,1};

//input the values

for(nCount=0; nCount < 5; nCount++)
{
    printf("Please input string %d/5: ", nCount + 1);
    fgets(arc5Strings[nCount], 256, stdin);

}

printf("\n\n");

//print entire array
for(nCount3 = 0; nCount3 < 5; nCount3++)
{
    for(nCount4 = 0; arc5Strings[nCount3][nCount4] != '\0'; nCount4++)
    {
        printf("%d ", arc5Strings[nCount3][nCount4]);

        //ASCII values outputted in a line instead of in array format when using %c
    }

}



return 0;
}

我设计的旧2D数组选择排序 - 从代码中提取:

//-----------------------------------       
//set up the switch       

for(nCount5 = 0; nCount5 < 5; nCount5++)
{
    fMinVal[0][0] = arc5Strings[nCount5][0]; //min value is row 0 col 1
    nMinValPosition = nCount5;

    for(nCount6 = nCount5 + 1; nCount6 < 5; nCount6++)
    {
        if(arc5Strings[nCount6][1] < fMinVal[0][0])
        {
            fMinVal[0][0] = arc5Strings[nCount6][0];

            nMinValPosition = nCount6; 
        } 
        /* Perform the switch - actually switch the values */
        if(fMinVal[0][0] < arc5Strings[nCount5][0])
        {
            fTemp[0][1] = arc5Strings[nCount5][1];
            fTemp2[0][0] = arc5Strings[nCount5][0];

            arc5Strings[nCount5][1] = arc5Strings[nMinValPosition][1];
            arc5Strings[nCount5][0] = arc5Strings[nMinValPosition][0];
            arc5Strings[nMinValPosition][1] = fTemp[0][1];
            arc5Strings[nMinValPosition][0] = fTemp2[0][0];


            nMoves++;
        }
    }
}


//------------------------------   
    printf("\n\n");

        printf("The sorted list, in ascending order, using selection sort, is:\n\n");
    for(nCount3 = 0; nCount3 < 5; nCount3++)
    {
        for(nCount4 = 0; arc5Strings[nCount3][nCount4] != '\0'; nCount4++)
        {
            printf("%c", arc5Strings[nCount3][nCount4]);
        }

    }

    printf("\n %d moves were made to sort this list\n", nMoves);

编辑 - 乔治答案的结果:

Input1 = 90
Input2 = 70
Input3 = abc
Input4 = 500
Input5 = 200

Sorted Array Results:
200
90
70
abc
500

2 个答案:

答案 0 :(得分:1)

你走在正确的轨道上。我将按如下方式实现:

for(i=0;i<5;i++)
{
 indexOfCurrentSmallest = i;
 for(j=i;j<5;j++)
 {
  for(k=0;k<255;k++)
  {
    if(arc5Strings[j][k] < arc5Strings[indexOfCurrentSmallest][k])
    {
      //we found a new possible smallest
      indexOfCurrentSmallest = j;
      break;
    }
    else if(arc5Strings[j][k] > arc5Strings[indexOfCurrentSmallest][k])
    {
        //no point in searching further, the one we are looking at is already larger than the one we found.
        break;
    }
  }

 }
 //here, we have found the actual smallest, let's do a swap
 for(q=0;q<255;q++)
 {
  temp = arc5Strings[i][q];
  arc5Strings[i][q] = arc5Strings[indexOfCurrentSmallest][q];
  arc5Strings[indexOfCurrentSmallest][q] = temp;
 }
}

我没有测试过这段代码,但它应该大致是你要找的。基本上,它比较从左边开始的ASCII值,直到找到差异,然后存储索引以便在比较所有5个字符串之后进行交换。

编辑我现在已经测试了上面的代码,现在可以使用了。

答案 1 :(得分:0)

首先找到每个字符串长度

int length[5];
for(i = 0, i < 5, i++){
    length[i] = strlen(arc5Strings[i]);
}

对长度进行排序。那些具有相同的,比较第一个字母的值。 多数民众赞成。

瓦尔特