Ваши значения h
и i
не гарантируются, чтобы быть разными.Обмен в этом случае не только не поменяет ничего, но и испортит вашу память.
void selectsort(int*p ,int q){
int i,j,h,temp;
for(i=0;i<q-1;i++){
h=i; // <=== Here you start with identical values
for(j=i+1;j<q;j++){
if(p[h]>p[j]){
h=j; // This may or may not be executed.
}
}
// Here h can still be at same value as i.
// What happens in this case is shown in the comments below:
p[i]=p[i]+p[h]; // p[i]=p[i]+p[i]; ==> p[i] *=2;
p[h]=p[i]-p[h]; // p[i]=p[i]-p[i]; ==> p[i] = 0;
p[i]=p[i]-p[h]; // p[i]=p[i]-p[h]; ==> p[i] = 0;
}
}
Вы можете добавить что-то подобное перед обменом:
if (i==h)
continue;
Примечание:
Кроме академических случаев, я бы не предложил использовать такой подход.Обмен без временной переменной имеет множество недостатков:
- Работает только для целочисленных типов
- Требуется обработка для переполнения и т. Д.
- Требуется обработка для идентичных мест хранения.
- Требуются дополнительные арифметические операции, вызывающие больше кода и более длительное время выполнения
- Смущает читателей и затрудняет обслуживание
Он также имеет только одно преимущество
- Сохраняет стековое хранилище для 1 переменной.
Если ваша цель - сбить с толку читателей, вам следует искать версию, используя XOR вместо арифметики.;)