С++ массив сортировки char указателей

63
8

Можете ли вы рассказать мне, что случилось с моим методом? Я заканчиваю тем, что добавляю одно и то же, и на самом деле это не сортировка.


void sortArrays(){

int i, j;

for(i=0; i<counter; i++){

for( j=0; j<i; j++){

if( strcmp(title_arr[i], title_arr[j]) < 0){

char* title_temp = title_arr[i];

title_arr[j] = title_temp;

}

}

}

спросил(а) 2021-01-25T17:29:38+03:00 4 месяца, 3 недели назад
1
Решение
148

Это:


char* title_temp = title_arr[i];

title_arr[j] = title_temp;


Является эквивалентным:


title_arr[j] = title_arr[i];

Вы никогда не меняете их, вы просто копируете один в другой. Вы должны добавить эту строку:


title_arr[i] = title_arr[j];

Между ними. Таким образом, вы перезапишете [i] с помощью [j], но _temp все еще сохраняет старое значение [i], поэтому вы можете скопировать это значение в [j], заменив их.


Я полагаю, что это также время для урока по алгоритмам. Ваш алгоритм известен как алгоритм "bubble sort" . Он известен своей простотой, но в реалистичной обстановке он известен своей неэффективностью (технический термин "teh sux", а реальный технический термин - O(n^2) ( "N квадрат" ). Некоторые более общие (и более эффективные) алгоритмы включают Quicksort, merge sort и Heapsort, среди многих других. Подробнее об измерении алгоритмической масштабируемости см. Статью Обозначение Big Oh. *


Но, как указала vava в комментарии, если ваше задание не предназначено для написания вашей собственной функции сортировки, вы получите лучшую производительность с помощью qsort (в C) или std::sort (на С++).


int mystrsort(const void *a, const void *b)
{
return strcmp(*(const char **)a, *(const char **)b);
}

// later:
qsort(title_arr, sizeof title_arr / sizeof(char *), sizeof(char *), mystrsort);


Я не буду бить в std::sort, но он будет работать примерно одинаково (возможно, проще). **


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

** Обратите внимание, что любой, кто любит, может добавить пример std::sort. Я просто недостаточно знаком с С++.

ответил(а) 2021-01-25T17:29:38+03:00 4 месяца, 3 недели назад
77

Вы не поменяли местами, почему это не сработало.

#include <iostream>
#include <algorithm>

int const counter = 4;
char * title_arr[counter] = {
"d", "c", "b", "a"
};

void sortArrays(){
for(int i = 0; i < counter; i++){
for(int j = 0; j < i; j++){
if(strcmp(title_arr[i], title_arr[j]) < 0){
char* title_temp = title_arr[i];
title_arr[i] = title_arr[j];
title_arr[j] = title_temp;
//you wouldn't have made that stupid mistake this way.
//std::swap(title_arr[i], title_arr[j]);
}
}
}
}

int compare(void const * a, void const * b) {
return strcmp(static_cast<char const *>(a), static_cast<char const *>(b));
}

struct StringLess : public std::binary_function<char const *, char const *, bool> {
bool operator() (char const * a, char const * b) const {
return strcmp(a, b) < 0;
}
};

int main(int argc, char * argv[])
{
sortArrays();
//those ones better
// qsort(title_arr, counter, sizeof(char *), compare);
// std::sort(title_arr, title_arr + counter, StringLess());
for (int i = 0; i < counter; i++) {
std::cout << title_arr[i] << ", ";
}
return 0;
}

ответил(а) 2021-01-25T17:29:38+03:00 4 месяца, 3 недели назад
63

Плохой стиль кодирования:

1. Не используйте глобальные переменные. Лучше передать массив и длину в качестве аргументов в функцию сортировки. Зачем? Ваша функция не может использоваться повторно. Что делать, если вам нужно отсортировать другой массив? Да, вам нужно будет написать другую функцию сортировки...

2. Более продвинутый совет: используйте эмуляцию функции более высокого порядка. Что делать, если вам нужно сортировать не только символы? Целое число, поплавки, строки или собственные типы. В этом случае вы также можете передать функцию compare() в свою функцию сортировки, которая может сравнивать объекты вашего массива.

ответил(а) 2021-01-25T17:29:38+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема