C++ Использование указателей для функции выбора сортировки

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

Вот звонок:

int size = 10000;
int* data = new int[size]; 
//omitted code that populates array for the sake of space
selectionSort(data, data+size); 

И вот моя неправильная попытка функции:

void selectionSort(int* first, int* last) { 
for (int* i = first; i < last-1; i++) {
    int* min = i;
    for (int* j = i+1; j < last; j++) {
        if (j < min) {
            min = j; 
        }
        int* temp = i; 
        i = min; 
        min = temp; 
    }
}

}

По сути, мне трудно понять, что происходит, когда я сравниваю один указатель с другим или настраиваю указатель. Он корректирует / сравнивает значение, на которое указывает, или сравнивает сами указатели?

Любая помощь приветствуется. Приветствия.

3 ответа

Решение

Указатели иногда сложная концепция, чтобы обмануть. Возможно, это поможет воспринимать их как ссылку на значение, а не на само значение (это адрес почтового ящика, а не содержимое почтового ящика).

В вашем коде 'int * min = i;' устанавливает min на тот же адрес (ссылка), что и "i". Итак, позже в своем "if" утверждении if (j

В указателях, если,

int* i; //i holds actual physical memory address & i* holds value at that address.

Теперь в вашем selectionSort функции if Условие вы сравниваете фактические адреса памяти, а не значения. Смотрите пример здесь.

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

Другие вопросы по тегам