Сортировка 2 массивов по строкам с использованием quick_sort

#c

#c

Вопрос:

Мне дано 2 массива, один из которых содержит имена, а другой — фамилии. До сих пор мне удавалось сортировать фамилии в алфавитном порядке, сохраняя при этом соответствующее имя. Проблема, с которой я сталкиваюсь, связана с повторяющимися фамилиями. Моя цель — сначала отсортировать фамилии, затем, если у группы людей одинаковые фамилии, я хочу отсортировать их имена, оставив остальную часть массива нетронутой.

 #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) amp;amp; (compare(list1[low], pivot, list2[low], list2[end]) <= 0))
         low  ;
     
      while ((high > low) amp;amp; (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;   
}
  

Комментарии:

1. Какая-либо конкретная причина не использовать стандартную функцию сортировки библиотеки?

2. Я должен включить quick_sort. @joker007

Ответ №1:

Ваш код в значительной степени правильный, вам нужно будет обновить функцию сравнения до чего-то подобного.

 int compare(string last1, string last2, string first1, string first2)
{
    if(last1 == last2)
        return first1 < first2;
    else return last1 < last2;
}
  

Здесь сравниваются первые фамилии, если они совпадают, тогда сравниваются только имена.
Эта функция возвращает 1, если полное имя 1 < полное имя 2 и возвращает 0, если полное имя 1 > = полное имя 2

Вам также необходимо изменить циклы while в функции quick_sort, которые используют эту функцию сравнения .

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

while ((high > low) amp;amp; (compare(list1[high], pivot, list2[high], list2[end]) == 0))
            high--;
  

Одна ошибка заключалась в том, что во 2-м цикле while вы использовали аргументы (list1[high] , pivot , list2[low],list2[end]) , но list1[high] и list2[low] не представляют одно и то же имя, поэтому так и должно быть list2[high] .
Кроме того, теперь сравнения имеют значение 1 или 0, а не <= 0 или > 0 , так как теперь функция сравнения возвращает логическое значение (true или false , 1 или 0, yada yada)

Комментарии:

1. Я пытался разобраться в этом уже пару часов, спасибо!

Ответ №2:

Вы можете сделать это за один проход с помощью правильной функции сравнения.

Вы должны передавать строки по ссылке на вашу функцию сравнения и делать это как можно быстрее. Создание копий немного замедлит вашу сортировку, равно как и ненужные сравнения.

 int compare(const stringamp; last1, const stringamp; last2, const stringamp; first1, const stringamp; first2) {
    int result = last1.compare(last2);
    if (result == 0)
        result = first1.compare(first2);
    return resu<
}