我用两个字符串数组创建了一个程序。清单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
答案 0 :(得分:1)
您的代码是正确的,但问题出在if条件
if( strcmp( list1[i], list2[j] ) > 0 )
标志应为<
而非>
尝试使用此代码行而不是之前的代码行,它将起作用。 如果条件找到较高的字符串,您试图找到从低到高的字符串以及您要说的字符串。因此,首先如果条件没有给你想要的结果。
if( strcmp( list1[i], list2[j] ) < 0 )