【问题标题】:Merging algorithm to sort two string arrays while merging合并算法在合并时对两个字符串数组进行排序
【发布时间】:2018-09-25 23:26:07
【问题描述】:

我制作了一个包含两个字符串数组的程序。清单 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

【问题讨论】:

  • 使用函数,因为你的代码是一大堆代码,第一眼很难看出问题出在哪里。制作一个 ArraySorting 函数,一个 ArrayDisplay 函数,它会清理你的 main。最后,如果您的 objectif 只是对最终数组进行排序,则可以将两个数组“合并”为一个,然后对结果数组进行“排序”。这是最简单的方法,虽然它不像你想要的那样进行合并排序。
  • 尝试if( strcmp( list1[i], list2[j] ) &lt; 0 ) - 您当前在合并中使用更大的 两个字符串。
  • 强制:“这两个列表使用冒泡排序算法单独排序。” - 永远不要使用冒泡排序。
  • 我需要高效的归并排序。我也会做功能。
  • 对于便携,高效体面的排序,查看qsort

标签: c string algorithm merge


【解决方案1】:

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

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

标志应该是&lt; 而不是&gt;

试试这个代码行而不是前一个代码行,它会起作用。 您正试图找到从低到高的字符串,如果条件是找到较高的字符串,您要说什么。因此,首先如果条件没有给你想要的结果。

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

【讨论】:

    猜你喜欢
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多