2种排序方法的未预期结果C.

时间:2014-02-04 23:00:41

标签: c sorting

我从C中的冒泡排序程序中得到了意想不到的结果。 下面的程序是一个程序,它从用户那里获取5个输入,对它们进行选择排序,然后对它们进行交换排序。

如果我使用这些输入:

50
150
75
175
23

它应该按以下方式对它们进行排序:

23
50
75
150
175

但是,它没有正确排序,并按如下方式进行排序(交换方式相反,因为它以降序排列):

150
175
23
50
75

它很奇怪,因为如果输入某些值,它会正确排序,例如:

73
84
03
26
83

不太清楚它是怎么回事。当技术上适用于某些值时,我无法开始对其进行更改。

我必须在某处遗漏某些东西。

任何帮助都将不胜感激。

完整的代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0

int main(int argc, char *argv[])
{
    char    arc5Strings[5][256];
    int nCount, nCount2, nCount3, nCount4, nCount5, nCount6, nCount7, letter, sorted;


    int fMinVal[1][2] = {1,1};
    int nMinValPosition;
    int nMoves;
    int nRow;
    int i, j, k, indexOfCurrentSmallest, q, temp;
    char    arcTemp[256];
    int nOutOrder;
    int nNumValues;
    int clean1, clean2;

    //input the values

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

            if(strlen(arc5Strings[nCount]) > 11)
            {
                printf("Your string contains more than 10 characters. Please try again.");
                nCount = 5;
                exit(0);
            }

    }

    //------------------------------------------------------------------------------
    //Selection Sort

    printf("\n\n");

    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;
                    }
              }
        }

         //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;
         }
    }   

    //---------------------------------------------------------------

    //print entire array

    printf("This is your selection sorted array based on ASCII values\n\n");
    for(nCount3 = 0; nCount3 < 5; nCount3++)
    {
        for(nCount4 = 0; arc5Strings[nCount3][nCount4] != '\0'; nCount4++)
        {
            printf("%c", arc5Strings[nCount3][nCount4]);
        }

    }

    //---------------------------------------------------------------------
    //Exchange Sort

    nNumValues = 5;
    nOutOrder = TRUE;
    nMoves = 0;

    while(nOutOrder && nNumValues > 0) 
    {
        nOutOrder = FALSE;
        for(i=0;i<5;i++)
        {
            for(nCount=0; nCount < nNumValues -1; nCount++)
                 {
                        for(nCount2=0, sorted=0; sorted==0; nCount2++)
                        {
                              if(arc5Strings[nCount][nCount2] < arc5Strings[nCount+1][nCount2])
                              {
                                     for(letter=0; letter<256; letter++)
                                     {
                                        arcTemp[letter] = arc5Strings[nCount][letter];
                                     }

                                     for(letter=0; letter<256; letter++)
                                     {
                                        arc5Strings[nCount][letter]= arc5Strings[nCount+1][letter];
                                     }

                                     for(letter=0; letter<256; letter++)
                                     {
                                        arc5Strings[nCount+1][letter] = arcTemp[letter];
                                     }

                                     sorted = 1;
                                     nMoves++;
                              }
                              else if (arc5Strings[nCount][nCount2] < arc5Strings[nCount+1][nCount2])
                                   sorted = 1;
                        }
                 }

            nNumValues--;
        }
    }

    printf("\n\n\nThe sorted list in Descending order is: \n\n\n");
    for(nCount5 = 0; nCount5 < 5; nCount5++)
    {
            printf("%s", arc5Strings[nCount5]);
    }

//-----------------------------------------------

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

    return 0;
}   

2 个答案:

答案 0 :(得分:3)

这是因为你要排序字符串而不是数字,所以它使用基于字符的排序。

换句话说,"175"小于"23",因为"1"小于"2"

如果要将它们排序为数字,请先将它们转换为数字。

答案 1 :(得分:0)

在使用整数时,您正在使用字符串。将字符串转换为整数或直接使用int

如果您想比较字符串

,请参阅此链接示例

compare two alphanumeric string

如果你不需要文本作为比较的输入

,再次使用整数数组