合并算法在合并时对两个字符串数组进行排序

时间:2018-04-16 09:15:00

标签: c string algorithm merge

我用两个字符串数组创建了一个程序。清单1&清单2.它们未分类。

程序运行,并使用冒泡排序算法对两个列表进行单独排序。然后将它们合并为第三个数组并打印到屏幕上。

在这个阶段,我试图合并将数组排序在一起,同时合并它们却收效甚微。将前半部分和后半部分合并在一起,使其两个列表按字母顺序使用合并排序排序。目前,合并仅将数组添加到一起。我希望这个算法可以用于更大的数组。任何建议都会很棒!抱歉英语不好,不是我的第一语言!

#include <stdio.h>
#include <string.h>
#define BIG 42
int main()
{
//initialising variables and the arrays containing each of the four groups.
char *list1 [10] = 
{ 
    "Ant ", 
    "Donald ", 
    "Mark ", 
    "Paul ", 
    "Steven ", 
    "Andrew ", 
    "Kenneth", 
    "George ", 
    "Joshua ", 
    "Kevin " 
} ;

char *list2 [6] = 
{   
    "Frank ", 
    "Brandon ", 
    "Greg ", 
    "Samuel ", 
    "Patrick ", 
    "Alexander "
} ;

int length_list1 = 10 ;
int length_list2 = 6 ;
char *big_array2 [BIG] ;  

//This is a bubble sorting Algorithm. It sorts list1 & list2 in order and then prints the sorted arrays out.
//
for (int j = 0 ; j < length_list1 - 1 ; j++ )//This loop takes the top number off every time the algorithm repeats to save time,
{
    for (int i = j + 1 ; i < length_list1 ; i++ ) //this loop goes from 0 to the length of list1 and will do everything within the braces.
    {
        if( strcmp( list1[j],  list1[i]) > 0 ) //strcmp is a function that compares the strings to see which is alphabetically closer to a.
        {
            char *temp =  list1[j] ;//temp stores one of the strings if a swap needs to be done.
            list1[j] =  list1[i] ;
            list1[i] = temp ;
        }//end if
    }//end for
}//end for

for (int j = 0 ; j < length_list2 - 1 ; j++ )//This loop takes the top number off every time the algorithm repeats to save time,
{
    for (int i = j + 1 ; i < length_list2 ; i++ )//this loop goes from 0 to the length of list2 and will do everything within the braces.
    {
        if( strcmp(list2[j],list2[i]) > 0 ) //strcmp is a function that compares the strings to see which is alphabetically closer to a.
        {
            char *temp = list2[j] ;//temp stores one of the strings if a swap needs to be done.
            list2[j] = list2[i] ;
            list2[i] = temp ;
        }//end if
    }//end for
}//end for

//Printing the sorted arrays out using for loops.
//
printf( "\n\nlist1(in order) :\n " ) ;
for ( int i = 0 ; i < length_list1 ; i++ )
printf( "\n%d) %s", i + 1, list1[i] ) ;
printf( "\n\nlist2(in order) :\n " ) ;
for ( int i = 0 ; i < length_list2 ; i++ )
printf( "\n%d) %s", i + 1, list2[i] ) ;
//This is a merging algorithm. It merges list1 &list2 into the array big_array2.
//
//intiailising variables that will be used for while loops.
//
int i = 0 ;
int j = 0 ;
int index = 0 ;

while( i < length_list1 && j < length_list2 ) //This while loop will continue while i is less than the length of the first array
{                                               //and j is less than the length of the second array.
    if( strcmp( list1[i], list2[j] ) > 0 ) //This if statement uses the strcmp function and compares the n elements of the two arrays.
    {                                        //If list1 is alphabetically closer to 'a' then it will be added to n spot of the big array.
        big_array2[index] = list1[i] ;
        i++ ;                               //Now 'i' will be incremented by one so in that array it moves on to the next number for comparison.
    }//end if

    else                                    //If list2 is alphabetically closer to 'a' then it will be added to n spot of the big array.
    {
        big_array2[index] = list2[j] ;
        j++ ;                               //Now 'j' will be incremented by one so in that array it moves on to the next number for comparison.
    }//end else
    index++ ;                               //Now 'index' will be incremented by one so the big arrays position will increase by one so another comparison between
}//end while                                                                    // the two arrays can be done.

while( i < length_list1 )                  //This is a while statement incase that j reaches its length before i. then it will assume that i has to take the rest of the spots in the big array.
{
    big_array2[index] = list1[i] ;
    i++ ;
    index++ ;
}//end while

while( j < length_list2 )                  //This is a while statement incase that i reaches its length before j. then it will assume that j has to take the rest of the spots in the big array.
{
    big_array2[index] = list2[j] ;
    j++ ;
    index++ ;
}//end while
printf( "\n\n\n" ) ;
puts("");
for ( int index=0; index < 16; index++)
{
    printf("Merged %d is %s\n", index+1, big_array2[index]);
}
getchar();
return 0;
 }//end main()

我得到的输出是:

  list1(in order) :

  1) Andrew
  2) Ant
  3) Donald
  4) George
  5) Joshua
  6) Kenneth
  7) Kevin
  8) Mark
  9) Paul
  10) Steven

   list2(in order) :

   1) Alexander
   2) Brandon
   3) Frank
   4) Greg
   5) Patrick
   6) Samuel



   Merged 1 is Andrew
   Merged 2 is Ant
   Merged 3 is Donald
   Merged 4 is George
   Merged 5 is Joshua
   Merged 6 is Kenneth
   Merged 7 is Kevin
   Merged 8 is Mark
   Merged 9 is Paul
   Merged 10 is Steven
   Merged 11 is Alexander
   Merged 12 is Brandon
   Merged 13 is Frank
   Merged 14 is Greg
   Merged 15 is Patrick
   Merged 16 is Samuel

1 个答案:

答案 0 :(得分:1)

您的代码是正确的,但问题出在if条件

if( strcmp( list1[i], list2[j] ) > 0 )

标志应为<而非>

尝试使用此代码行而不是之前的代码行,它将起作用。 如果条件找到较高的字符串,您试图找到从低到高的字符串以及您要说的字符串。因此,首先如果条件没有给你想要的结果。

if( strcmp( list1[i], list2[j] ) < 0 )