Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用快速排序按行排序2个数组_C++ - Fatal编程技术网

C++ 使用快速排序按行排序2个数组

C++ 使用快速排序按行排序2个数组,c++,C++,我得到了两个数组,一个包含名字,另一个包含姓氏。到目前为止,我已经能够按字母顺序对姓氏进行排序,同时保留相应的名字。我的问题是姓氏重复。我的目标是首先对姓氏进行排序,然后如果一组人的姓氏相同,我希望对他们的姓氏进行排序,同时保持数组的其余部分不变 #include <iostream> #include <string> #include <stdio.h> #include <stdlib.h> using namespace std; #def

我得到了两个数组,一个包含名字,另一个包含姓氏。到目前为止,我已经能够按字母顺序对姓氏进行排序,同时保留相应的名字。我的问题是姓氏重复。我的目标是首先对姓氏进行排序,然后如果一组人的姓氏相同,我希望对他们的姓氏进行排序,同时保持数组的其余部分不变

#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
#define NUM_PEOPLE 10

void swap(string *array1, string *array2, int index1, int index2) {
    string temp1 = array1[index1];
    array1[index1] = array1[index2];
    array1[index2] = temp1;
   
    string temp2 = array2[index1];
    array2[index1] = array2[index2];
    array2[index2] = temp2;
   
}

int compare(string last1, string last2, string first1, string first2) {
    return (last1.compare(last2));
}


int quick_sort(string list1[], string list2[], int start, int end) {
   
   int low = start;
   int high = end;
   string pivot = list1[end];
   
   do {
      while ((low < high) && (compare(list1[low], pivot, list2[low], list2[end]) <= 0))
         low++;
     
      while ((high > low) && (compare(list1[high], pivot, list2[low], list2[end]) >= 0))
         high--;
         
      
      if (low < high)
         swap(list1, list2, low, high);
        
     
   } while (low < high);
   if (low != end)
      swap(list1, list2, low, end);
   
   if (low - 1 > start)
      quick_sort(list1, list2, start, low - 1);
   
   if (end > low + 1)
      quick_sort(list1, list2, low + 1, end);
}


int main(){
    string first_names[] =   {"Kwame",
                              "Moesha",
                              "Loren",
                              "Elicia",
                              "Cathy",
                              "Aiesha",
                              "Amie",
                              "Saim",
                              "Dilara",
                              "Alessia" };
    
    string last_names[] =    {"Sanders",
                              "Cooper",
                              "Rangel",
                              "Cooper",
                              "Wang",
                              "Cooper",
                              "Jarvis",
                              "Fritz",
                              "Workman",
                              "Gould" };
    
    quick_sort(last_names, first_names, 0, NUM_PEOPLE - 1);
    
    for (int i = 0; i < NUM_PEOPLE; i++)
       cout << first_names[i] << "\t" << last_names[i] << endl;   
}
#包括
#包括
#包括
#包括
使用名称空间std;
#定义人数10
无效交换(字符串*array1、字符串*array2、int-index1、int-index2){
字符串temp1=array1[index1];
阵列1[index1]=阵列1[index2];
阵列1[index2]=temp1;
字符串temp2=array2[index1];
array2[index1]=array2[index2];
阵列2[index2]=temp2;
}
int比较(字符串last1、字符串last2、字符串first1、字符串first2){
返回(last1.compare(last2));
}
int快速排序(字符串列表1[],字符串列表2[],int开始,int结束){
int low=开始;
int高端=高端;
字符串轴=列表1[结束];
做{
而((低<高)和&(比较(列表1[低]、枢轴、列表2[低]、列表2[结束])低)和&(比较(列表1[高]、枢轴、列表2[低]、列表2[结束]>=0))
高--;
如果(低<高)
交换(列表1、列表2、低、高);
}而(低<高);
如果(低!=结束)
交换(列表1、列表2、低端、低端);
如果(低-1>启动)
快速排序(列表1、列表2、开始、低-1);
如果(结束>低位+1)
快速排序(列表1、列表2、低+1、结束);
}
int main(){
字符串first_names[]={“Kwame”,
“Moesha”,
“罗兰”,
“Elicia”,
“凯西”,
“艾莎”,
“阿米”,
“赛姆”,
“迪拉拉”,
“阿莱西亚”};
字符串last_names[]={“Sanders”,
“库珀”,
“兰格尔”,
“库珀”,
“王”,
“库珀”,
“贾维斯”,
“弗里茨”,
“工人”,
“古尔德”};
快速排序(姓、名、0、人数-1);
对于(int i=0;icout您的代码非常正确,您需要将比较函数更新为类似这样的内容

int compare(string last1, string last2, string first1, string first2)
{
    if(last1 == last2)
        return first1 < first2;
    else return last1 < last2;
}
int比较(字符串last1、字符串last2、字符串first1、字符串first2)
{
如果(last1==last2)
返回first1
这里比较的是姓氏,如果它们相同,则只比较姓氏。 如果全名1<全名2,则此函数返回1;如果全名1>=全名2,则此函数返回0

您还需要修改quick_sort函数中使用此比较函数的while循环

while ((low < high) && (compare(list1[low], pivot, list2[low], list2[end]) == 1))
            low++;

while ((high > low) && (compare(list1[high], pivot, list2[high], list2[end]) == 0))
            high--;
while((低<高)&(比较(list1[low],pivot,list2[low],list2[end])==1))
低++;
while((高>低)&&(比较(list1[high],pivot,list2[high],list2[end])==0))
高--;
一个错误是,在第二个while循环中,您使用了参数
(list1[high]、pivot、list2[low]、list2[end])
,但是
list1[high]
list2[low]
并不代表相同的名称,因此它应该是
list2[high]

而且,现在比较有1或0,而不是0,因为现在比较函数返回布尔值(true或false,1或0,yada-yada)

您可以使用适当的比较函数一次性完成

您应该通过引用将字符串传递给您的比较函数,并使其尽可能快。复制副本会大大降低排序速度,不必要的比较也会如此

int compare(const string& last1, const string& last2, const string& first1, const string& first2) {
    int result = last1.compare(last2);
    if (result == 0)
        result = first1.compare(first2);
    return result;
}

有什么特别的理由不使用标准库排序功能吗?我需要包括快速排序。@joker007I我已经想了好几个小时了,谢谢!