#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<
}