使用冒号排序对字符串数组进行排序

时间:2018-04-12 13:10:49

标签: c string algorithm sorting bubble-sort

非常感谢任何帮助。 我试图按字母顺序对12个字符串进行排序,这些字符串包含在使用冒泡排序的数组中,代码如下:

#include <stdio.h>
#include <string.h>
int main()
{
   //initialising variables and the array
   char *DT [12] = { "James Smith DT01 DT265A", "John Murphy DT02 DT265A", "Robert Lam DT03 DT265A", "Michael Martin DT04 DT265A", "William Brown DT05 DT265A", "David Roy DT06 DT265A", "Richard Tremblay DT07 DT265A", "Joseph Lee DT08 DT265A", "Thomas Gagnon DT09 DT265A", "Charles Wilson DT10 DT265A", "Chris Philips DT11 DT265A", "Henry Hill DT12 DT265A"  } ;
   char temp[100];
   int n = sizeof(DT)/sizeof(DT[0]);

   //Implementing Algorithm using bubble sort to sort string array
   //
   for (int j = 0 ; j < n - 1 ; j++ )
   {
      for (int i = j + 1 ; i < n ; i++ )
      {
         if( strcmp(DT[j], DT[i]) > 0 ) 
         {
            strcpy(temp, DT[j]);
            strcpy(DT[j], DT[i]);
            strcpy(DT[i], temp);
         }//end if
      }//end for
   }//end for
   printf("Strings in sorted order are : ");
   for (int i=0; i<n; i++)
   {
      printf("\n String %d is %s", i+1, DT[i]);
   }

   getchar();
   getchar();
   return 0;
}//end main()

我得到的输出是:

排序顺序的字符串是:

字符串1是A

字符串2是A

字符串3是2vid Roy DT06 DT265A

String 4是Roy DT06 DT265A

字符串5是Charles Wilson DT10 DT265A

字符串6是

String 7是Chris Philips DT11 DT265A

字符串8是06 DT265A

字符串9是avidRoy DT06 DT265A

String 10是mith DT01 DT265David Roy Dyy DT06 DT265A

字符串11是y DT06 DT265A

字符串12是y DT06 DT265A

4 个答案:

答案 0 :(得分:5)

问题是您尝试覆盖文字字符串的内容,C中的文字字符串是 只读 字符数组。

不要尝试复制字符串本身,而是复制指针。如在

char *temp = DT[j];
DT[j] = DT[i];
DT[i] = temp;

另一种可能的解决方案是使DT成为数组的数组:

char DT[12][100] = { ... };

确保辅助数组的大小足以容纳最长的字符串(加上一个,因为您当然也需要终结符的空间)。

答案 1 :(得分:1)

你有一个指向字符串文字的指针数组

char *DT [12] = { "James Smith DT01 DT265A", ... };

然后你试图改变字符串文字。

strcpy(DT[j], DT[i]);
strcpy(DT[i], temp);

但是,您可能无法更改字符串文字。任何更改字符串文字的尝试都会导致未定义的行为。

来自C标准(6.4.5字符串文字)

  

7未指明这些阵列是否与它们不同   元素具有适当的值。 如果程序尝试   修改这样的数组,行为是未定义的。

你需要交换的是指向字符串文字的指针。

另请注意,您错误地实施了冒泡排序算法。实际上,您实现了低效的选择排序。冒泡排序算法基于比较相邻元素。

根据C标准,没有参数的函数main应声明为

int main( void )

这是一个演示程序,显示了如何将冒泡排序算法应用于您的阵列。

#include <stdio.h>
#include <string.h>

int main(void) 
{
    enum { N = 12 };
    char * DT[N] = 
    { 
        "James Smith DT01 DT265A", 
        "John Murphy DT02 DT265A", 
        "Robert Lam DT03 DT265A", 
        "Michael Martin DT04 DT265A", 
        "William Brown DT05 DT265A", 
        "David Roy DT06 DT265A", 
        "Richard Tremblay DT07 DT265A", 
        "Joseph Lee DT08 DT265A", 
        "Thomas Gagnon DT09 DT265A", 
        "Charles Wilson DT10 DT265A", 
        "Chris Philips DT11 DT265A", 
        "Henry Hill DT12 DT265A"  
    };

    for ( size_t n = N, last; !( n < 2 ); n = last )
    {
        for ( size_t i = last = 1; i < n; i++ )
        {
            if ( strcmp( DT[i], DT[i-1] ) < 0 )
            {
                char *tmp = DT[i];
                DT[i] = DT[i-1];
                DT[i-1] = tmp;
                last = i;
            }
        }
    }

    puts( "Strings in sorted order are" );

    for ( size_t i = 0; i < N; i++ )
    {
        printf( "String %zu is %s\n", i + 1, DT[i] );
    }

    return 0;
}

程序输出

Strings in sorted order are
String 1 is Charles Wilson DT10 DT265A
String 2 is Chris Philips DT11 DT265A
String 3 is David Roy DT06 DT265A
String 4 is Henry Hill DT12 DT265A
String 5 is James Smith DT01 DT265A
String 6 is John Murphy DT02 DT265A
String 7 is Joseph Lee DT08 DT265A
String 8 is Michael Martin DT04 DT265A
String 9 is Richard Tremblay DT07 DT265A
String 10 is Robert Lam DT03 DT265A
String 11 is Thomas Gagnon DT09 DT265A
String 12 is William Brown DT05 DT265A

如果要处理包含字符串的二维字符数组,那么程序可以采用以下方式

#include <stdio.h>
#include <string.h>

int main(void) 
{
    enum { M = 12, N = 100 };
    char DT[M][N] = 
    { 
        "James Smith DT01 DT265A", 
        "John Murphy DT02 DT265A", 
        "Robert Lam DT03 DT265A", 
        "Michael Martin DT04 DT265A", 
        "William Brown DT05 DT265A", 
        "David Roy DT06 DT265A", 
        "Richard Tremblay DT07 DT265A", 
        "Joseph Lee DT08 DT265A", 
        "Thomas Gagnon DT09 DT265A", 
        "Charles Wilson DT10 DT265A", 
        "Chris Philips DT11 DT265A", 
        "Henry Hill DT12 DT265A"  
    };

    for ( size_t n = M, last; !( n < 2 ); n = last )
    {
        for ( size_t i = last = 1; i < n; i++ )
        {
            if ( strcmp( DT[i], DT[i-1] ) < 0 )
            {
                char tmp[N];
                strcpy( tmp, DT[i] );
                strcpy( DT[i], DT[i-1] );
                strcpy( DT[i-1], tmp );
                last = i;
            }
        }
    }

    puts( "Strings in sorted order are" );

    for ( size_t i = 0; i < M; i++ )
    {
        printf( "String %zu is %s\n", i + 1, DT[i] );
    }

    return 0;
}

其输出与上面显示的相同。

答案 2 :(得分:0)

您不能在只读字符串上使用strcpy。当您键入“James Smith DT01 DT265A”并影响其地址时,此字符串是只读的。

因此,如果您想保持这种方式,可以替换

char temp[100];
...
        strcpy(temp, DT[j]);
        strcpy(DT[j], DT[i]);
        strcpy(DT[i], temp);

通过

char *temp;
...
        temp = DT[j];
        DT[j] = DT[i];
        DT[i] = temp;

答案 3 :(得分:0)

您可以使用char arr[][MAX]并使用以下功能进行排序:

void sortStrings(char arr[][MAX], int n)
{
    char temp[MAX];

    // Sorting strings using bubble sort
    for (int j=0; j<n-1; j++)
    {
        for (int i=j+1; i<n; i++)
        {
            if (strcmp(arr[j], arr[i]) > 0)
            {
                strcpy(temp, arr[j]);
                strcpy(arr[j], arr[i]);
                strcpy(arr[i], temp);
            }
        }
    }
}