【发布时间】: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] ) < 0 )- 您当前在合并中使用更大的 两个字符串。 -
强制:“这两个列表使用冒泡排序算法单独排序。” - 永远不要使用冒泡排序。
-
我需要高效的归并排序。我也会做功能。
-
对于便携,
高效体面的排序,查看qsort