Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
ыфырф1992
25 / 25 / 17
Регистрация: 08.04.2012
Сообщений: 200
#1

Работа функции qsort - объяснить работу функции

17.07.2014, 20:17. Просмотров 808. Ответов 16
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
#include<cstdlib>
int mysort(const void *arg1, const void *arg2);
int main() {
    const short ARR_SIZE=5;
    int arr[ARR_SIZE]={10,5,6,1,3};
    std::qsort(arr, ARR_SIZE, sizeof (int), mysort); 
    for (int i=0;i<ARR_SIZE;++i) {
        std::cout<<arr[i]<<std::endl;
    }
    std::cin.get();
    return 0;
}
int mysort (const void *arg1, const void *arg2) {
    return *(int*)arg1-*(int*)arg2;
}
код взят из учебника, для меня не понятно как работает вот этот эта пользовательская функция
C++
1
2
3
int mysort (const void *arg1, const void *arg2) {
    return *(int*)arg1-*(int*)arg2;
}
прошу подробно объяснить. Не знаю как сформулировать вопрос более точнее, так как мне в этой функции почти все не понятно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.07.2014, 20:17
Ответы с готовыми решениями:

Объяснить работу функции
Может кто объяснить работу функции void zagalovok() { Node *t; ...

Объяснить работу функции, вычисляющей сумму цифр числа
Добрый вечер. Наткнулся на код, который работает , но не понял как работает...

Объяснить работу функции, возвращающей указатель на указатель на char
Добрый день! Сможете объяснить что означает запись char **InputFile(int...

Шаблон функции qsort()
Здорова! Нужно реализовать шаблон функции qsort(). Скачал пример и никак не...

Алгоритм работы функции qsort
Всем добрый день, у меня тут небольшая просьба. Кому не трудно, выложите...

16
Vourhey
Почетный модератор
6492 / 2266 / 185
Регистрация: 29.07.2006
Сообщений: 12,534
17.07.2014, 20:22 #2
Из одного целого вычитается другое целое, результат возвращается.
0
ыфырф1992
25 / 25 / 17
Регистрация: 08.04.2012
Сообщений: 200
17.07.2014, 20:27  [ТС] #3
Vourhey, не это понятно. Вот например зачем тут
C++
1
(const void *arg1, const void *arg2)
void.
C++
1
2
3
{
    return *(int*)arg1-*(int*)arg2;
}
возвращение значений с помошью return с таким я раньше не сталкивался, как это работает? Вот нафиг здесь *(int*). arg1 это я как понимаю текущее значение элемента массива.
0
Vourhey
Почетный модератор
6492 / 2266 / 185
Регистрация: 29.07.2006
Сообщений: 12,534
17.07.2014, 20:36 #4
Цитата Сообщение от ыфырф1992 Посмотреть сообщение
Вот например зачем тут
Код C++
1
(const void *arg1, const void *arg2)
А ты читал в документации, какой параметр qsort принимает последним? Почитай.
Цитата Сообщение от ыфырф1992 Посмотреть сообщение
возвращение значений с помошью return с таким я раньше не сталкивался
Что значит не сталкивался? Всегда в С++ так и возвращаются значения из функций. (не учитывая передачу указателей и ref в параметрах). Если знаешь другой способ возвращения значения - пиши.
Цитата Сообщение от ыфырф1992 Посмотреть сообщение
Вот нафиг здесь *(int*)
Чтобы привести void* к целому к указателю на целое и потом к целому числу. Читаем про явное приведение типов.
Цитата Сообщение от ыфырф1992 Посмотреть сообщение
arg1 это я как понимаю текущее значение элемента массива.
Да, одно из.
2
ыфырф1992
25 / 25 / 17
Регистрация: 08.04.2012
Сообщений: 200
17.07.2014, 20:41  [ТС] #5
Vourhey, прощу прощения, я вроде как учусь по книге и все что вы перечислили я еще не увидел в главах этой книги. Буду учить далее и посмотрю и почитаю то что вы посоветовали
0
Vourhey
Почетный модератор
6492 / 2266 / 185
Регистрация: 29.07.2006
Сообщений: 12,534
17.07.2014, 20:51 #6
Цитата Сообщение от ыфырф1992 Посмотреть сообщение
все что вы перечислили я еще не увидел в главах этой книги
Я же не знаю, что это за книга. Значит, найдешь в другом месте, если в книге нет. Хотя, если применяется qsort, в книге стоило бы описать параметры, которые он принимает.
0
ыфырф1992
25 / 25 / 17
Регистрация: 08.04.2012
Сообщений: 200
20.07.2014, 03:34  [ТС] #7
Vourhey, почитал про приведение типов, прочитал про ключивое слово void. Но не понятна осталось маленькая деталь.
C++
1
2
3
int mysort (const void *arg1, const void *arg2) {
    return *(int*)arg1-*(int*)arg2;
}
Как я понимаю в данном случае ключевое слово void означает что указатель будет "универсальным". Он может ссылаться на любую переменную. Зачем тогда производить явное преобразование типов?Зачем звездочка после int?
Такая запись возможна?
C++
1
2
return *(int)arg1-*(int)arg2// или
return (int)*arg1-(int)*arg2
0
Vtulhu
423 / 377 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
20.07.2014, 17:58 #8
Как же компилятор поймет, как вычитать одно из другого, если он не знает, на что указывает этот указатель? Что там лежит по тому адресу, int или double? Сейчас это указатели "вообще". Поэтому надо сказать компилятору, что arg1 и arg2 - это указатели на int. А значит, надо привести их к типу (int*). Возможно, вот так будет понятнее:

C
1
2
3
4
5
6
7
8
int intcmp(const void* va, const void* vb)
{
    int* pa = (int*)aa;
    int* pb = (int*)bb;
    int a = *pa;
    int b = *pb;
    return ( a < b )? -1 : (a != b);
}
Кстати, возвращать в этой функции разность чисел - большая ошибка. Если a = 2000000000, а b = -2000000000, то на 32-битной платформе произойдет переполнение. a - b = -294967296. Будет такой эффект, как будто a < b.
0
Krock21rus
74 / 74 / 27
Регистрация: 18.11.2013
Сообщений: 373
Завершенные тесты: 2
21.07.2014, 10:50 #9
Итак. Вот моё объяснение:

qsort(массив,кол-во элементов,размер одного элемента в байтах,функция сравнения);
подробнее про функцию сравнения, у вас она mysort,

const void* это означает что принимается значение неизвестно какого типа, после в теле функции нужно задать алгоритм:

C++
1
return *(int *)arg1 - *(int *)arg2;
возвратит, если arg1>arg2 положительное значение, иначе отрицательное, если равны то 0, дальше qsort() сама решит что с ними делать

в функции использовано void так как функция рассчитана на разные типы данных, в данном случае на int, поэтому в скобках указано (int *), но, в принципе можно и использовать mysort(const int* a, const int* b);
если функция предназначается только для целочисленных типов данных
0
Psilon
Master of Orion
Эксперт .NET
5996 / 4848 / 902
Регистрация: 10.07.2011
Сообщений: 14,460
Записей в блоге: 5
Завершенные тесты: 4
21.07.2014, 11:03 #10
Vtulhu, имхо достаточно просто так:
C++
1
2
3
int mysort (const void *arg1, const void *arg2) {
    return *(int*)arg1 > *(int*)arg2;
}
ыфырф1992, вам достаточно понимать, что QSort - это функция сортировки сравнением, поэтому вы указываете функцию, которая скажет, какой из двух объектов должен быть расположен "раньше" в массиве. Принимается void, потому что вы можете сортировать любые структуры, хоть MyVeryCooLStruct. Достаточно определить отношение "меньше" (с помощью этой функции, которую некорректно назвали mysort), и можно соритровать все, что угодно.
0
Vtulhu
423 / 377 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
21.07.2014, 14:20 #11
Цитата Сообщение от Psilon Посмотреть сообщение
Vtulhu, имхо достаточно просто так:
Наверное, Вы имели в виду вот так:

C
1
2
3
int mysort (const void *arg1, const void *arg2) {
    return ( *(int*)arg1 > *(int*)arg2 )? 1 : -1;
}
Такой способ допустим, если нет равных элементов. Или нас не трогает тот факт, что они будут совершенно бессмысленно рокироваться. Кстати, я так подробно расписал для того, чтобы ТС уяснил пертурбации указателей.
0
Psilon
Master of Orion
Эксперт .NET
5996 / 4848 / 902
Регистрация: 10.07.2011
Сообщений: 14,460
Записей в блоге: 5
Завершенные тесты: 4
21.07.2014, 14:23 #12
Vtulhu, ну да.
Такой способ допустим, если нет равных элементов.
а вот это плевать, все равно быстрая сортировка не является устойчивой.
0
Vtulhu
423 / 377 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
21.07.2014, 15:01 #13
Цитата Сообщение от Psilon Посмотреть сообщение
а вот это плевать, все равно быстрая сортировка не является устойчивой.
Есть вопросы дисциплины и гигиены программирования. Тот факт, что нельзя быть чистым все время, не означает, что не надо мыться. Программируя с такой психологической установкой, Вы запустите "эффект разбитых окон".

http://www.adme.ru/psihologiya/teoriya-razbityh-okon-620055/

http://avl2.info/index.php?option=co...ammer&Itemid=8

http://avl2.info/index.php?option=co...ammer&Itemid=8

http://avl2.info/index.php?option=co...ammer&Itemid=8

http://www.youtube.com/watch?v=6bv_RRz24_g
0
Psilon
Master of Orion
Эксперт .NET
5996 / 4848 / 902
Регистрация: 10.07.2011
Сообщений: 14,460
Записей в блоге: 5
Завершенные тесты: 4
21.07.2014, 15:10 #14
Vtulhu, омг, при чем тут это? Быстрая сортировка - не устойчивая, значит, она все равно будет менять элементы со одинаковыми весами. Вернее, не будет, но вполне может. Завязываться на реализацию, что "вот на этих входных данных она не меняет что-то там местами" - хуже, чем предполагать, что она всегда не устойчива. Для устойчивой сортировки стоит пользоваться соответствующими средствами - от слияния, до классической IntroSort. Вроде как имеется std::stable_sort, насколько я помню...

Так что какая-то слишком бурная реакция на фразу "не стоит завязываться на реализацию". Считаете иначе?..
0
Krock21rus
74 / 74 / 27
Регистрация: 18.11.2013
Сообщений: 373
Завершенные тесты: 2
21.07.2014, 16:37 #15
Цитата Сообщение от Psilon Посмотреть сообщение
Vtulhu, имхо достаточно просто так:
Код C++
1
2
3
int mysort (const void *arg1, const void *arg2) {
return *(int*)arg1 > *(int*)arg2;
}
Неправильно!, ваша функция должна возвращать int, а вы пытаетесь вернуть bool, да ещё и без соблюдения приоритетов!
0
Vtulhu
423 / 377 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
21.07.2014, 20:12 #16
Цитата Сообщение от Krock21rus Посмотреть сообщение
Неправильно!, ваша функция должна возвращать int, а вы пытаетесь вернуть bool, да ещё и без соблюдения приоритетов!
Ты во всех темах будешь чушь пороть? Чушь уже устала визжать от боли. Ты бы почитал книжку какую-нибудь по С, прежде чем высказывать свое авторитетное мнение столь безапелляционно. Да, и по этикету что-нибудь в библиотеке возьми. А книги вот этого автора, если попадутся, хватай и беги - https://www.ozon.ru/person/291527/
0
Krock21rus
74 / 74 / 27
Регистрация: 18.11.2013
Сообщений: 373
Завершенные тесты: 2
23.07.2014, 13:04 #17
123
0
23.07.2014, 13:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.07.2014, 13:04

исправление функции qsort сортировки матрицы
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;math.h&gt; #include...

Шаблон функции сравнения для qsort()
Хочу отсортировать массив из int и из double с помощью qsort(). Для этого...

Выполнить сортировку массива с помощью стандартной функции быстрой сортировки qsort
2. Выполнить сортировку массива с помощью стандартной функции быстрой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru