Другие отметили, что существуют более быстрые и чистые способы сортировки.Но если вы хотите использовать собственную сортировку выбора, как вы написали, тогда вам просто нужно внести несколько изменений в ваш код.
Отделите логику «мне нужно поменять местами» от логики свопингасам.Тогда код становится намного чище, и становится более понятно, куда добавить дополнительную проверку.
Я только скопировал здесь внутренний цикл.Вы хотите заменить существующий внутренний цикл на этот.Я не понимаю, зачем вам нужны swap_pos
и min_pos
, поэтому я оставил семантику в покое.
for (j = i + 1; j < length; j++) { // find min
// first, determine whether you need to swap
// You want to swap if the first character of the new word is
// smaller, or if the letters are equal and the length is smaller.
bool doSwap = false;
if (array[j].word[0] < array[min_pos].word[0]) {
doSwap = true;
}
else if (array[j].word[0] == array[min_pos].word[0] &&
strlen(array[j].word) < array[min_pos].word) {
doSwap = true;
}
// do the swap if necessary
if (doSwap) {
swap_pos = j;
swap = array[min_pos]; // swap
array[min_pos] = array[i];
array[i] = swap;
}
}
Чтобы более наглядно проиллюстрировать необходимые логические изменения, я намеренно избегал делатьзначительные изменения стиля или простая оптимизация.