Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 22.04.2012
Сообщений: 16

Сортировка списка

22.04.2012, 12:19. Показов 2009. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте,
не совсем понимаю как должна быть реализована сортировка вставками в деке.
Что имеется на данный момент:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class List {
private:
    struct ListItem {
        int item;
        ListItem *next;
 
        ListItem (int i, ListItem *n = NULL){
            item = i;
            next = n;       
        }
    };
 
    int itemsCount;
    ListItem *first;
    ListItem *last;
 
public:
    List(){
        itemsCount = 0;
        first = last = NULL;
    }
 
    ~List();
        int Head() {
        return first->item;
    }
        int Tail() {
        return last->item;
    }
 
    void AddFirst (int item);
    void AddLast (int item);
    void DeleteFirst();
    void DeleteLast();
 
    void ShowList();
};
Может кто на русском объяснить что дальше мне делать? Каким образом сортировать список?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.04.2012, 12:19
Ответы с готовыми решениями:

"Сортировка двусвязного списка путем исключения элемента с минимальным значением и включения его в начало нового списка
Здравствуйте! Возникла проблема с программой. Тема: "Сортировка двусвязного списка путем исключения элемента с минимальным значением и...

Сортировка списка
есть список list<Student> g (содержит n-ое количество экземпляров класса). Нужно сделать отдельную функцию которая принимает этот список и...

Сортировка списка
Привет, всем.. Ребята помогите у подруги зачет по программированию ей надо решить задачку.. Информационное поле элемента...

7
Заблокирован
22.04.2012, 12:34
Дальше нужно написать наиболее оптимальный сортировочный алгоритм, и пропустить список через него.
Если с сортировочными алгоритмами еще не знаком, можешь позаимствовать здесь:
http://rosettacode.org/wiki/Sorting_algorithms
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,532
Записей в блоге: 1
22.04.2012, 14:48
Цитата Сообщение от IFree Host Посмотреть сообщение
Если с сортировочными алгоритмами еще не знаком, можешь позаимствовать здесь:
он же решил уже сортировать вставками. для списков как раз подходящий вариант.

Добавлено через 14 минут
как-то так. Писал в блокноте, могут быть ошибки.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void List::sort(){
Listitem* unsortedlist=first->next;
ListItem* ins_item, counter, pre;
first->next=NULL;//начинаем создавать новый список, перемещая в него элементы из несортированной части по очереди
while(unsortedlist){
  ins_item=unsortedlist;//элемент для вставки - первый в неотсортированной части
  unsortedlist=unsortedlist->next;// удаляем его из неё
  counter=first; //counter \указатель на место, куда вставить в отсортированную часть
  pre=NULL;
  while(counter){//ищем это место пока отсорт. часть не закончится...
   if (ins_item->item>counter->item){
     pre=counter;                             //при этом перемещаем указатель по отсортированной части
     counter=counter->next;              // запоминая, текущее и предыдущее место
     }
     else{
      break;//...или не найдём место, куда вставить элемент.
     }
  }
  if(pre) pre->next=ins_item;// вставляем элемент между предыдущим
  ins_item->next=counter;//и текущим элементом в отсортированной части
}
 
}
1
Заблокирован
22.04.2012, 15:11
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
он же решил уже сортировать вставками. для списков как раз подходящий вариант.
Извеняюсь, что невнимательно прочел. Могу тогда до кучи еще кинуть пример на С

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stddef.h>
 
static void insertion_sort(int *a, const size_t n) {
    size_t i, j;
    int value;
    for (i = 1; i < n; i++) {
        value = a[i];
        for (j = i; j > 0 && value < a[j - 1]; j--) {
            a[j] = a[j - 1];
        }
        a[j] = value;
    }
}
 
int main(void) {
    int a[] = {4, 65, 2, -31, 0, 99, 2, 83, 782, 1};
    insertion_sort(a, sizeof a / sizeof a[0]);
    return 0;
}
1
0 / 0 / 0
Регистрация: 22.04.2012
Сообщений: 16
22.04.2012, 15:43  [ТС]
IFree Host, массивы я понимаю как сортировать, видимо у меня проблемы с пониманием списка...
Kuzia domovenok, так я вроде с этим разобрался, пробую сейчас пузырек сделать
Для начала я просто решил попробовать как вообще происходит процесс обмена местами элементов. Т.к. у нас запись состоит из двух полей: само значение и указатель на след элемент, то значит если мы указатели поменяем местами, то и элементы получается тоже меняются.
Вот я написал обмен адресов, но после этого у меня программа не хочет выводить список (точнее бесконечно выводит). Не пойму в чем ошибка
C++
1
2
3
4
5
6
7
8
9
10
11
12
void List::Sort()
{
    ListItem *current = first;
    ListItem *temp;
    current = current->next; //просто чтоб с головой не заморачиваться, сравниваю 2 и 3 эл-т
 
    if (current->item > current->next->item){
        temp = current->next;
        current->next = current;
        current = temp;
    }   
}
Я походу в чем-то очень сильно ошибаюсь
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,532
Записей в блоге: 1
22.04.2012, 16:15
Цитата Сообщение от HelloWrld Посмотреть сообщение
void List::Sort()
{
* * ListItem *current = first;
* * ListItem *temp;
* * current = current->next; //просто чтоб с головой не заморачиваться, сравниваю 2 и 3 эл-т
if (current->item > current->next->item){
* * * * temp = current->next;
* * * * current->next = current;
* * * * current = temp;
* * } *
}
ну, настоящую сортировку надо в цикле делать, ну ладно будем считать это наброском алгоритма,

во-вторых, у тебя тут не происходит ничего current->next = current;
эта операция превратит этот список
C++
1
2
current-----v       |--------v      |----
            |item|next|   |item|next|
в такой
C++
1
2
3
                                      тут связь потеряна
current-----v      |------|                 |----
           |item|next|<---|       |item|next|
Добавлено через 12 минут
перестановку делать надо так(меняем второй и третий местами)
C++
1
2
3
4
5
6
7
8
(pre-первый элемент, current второй, current->next третий, current->next->next четвёртый)
pre->next=current->next;//разрываем связь первого со вторым,
///////////////////////// связываем первый с третьим 
current->next=current->next->next;//разрываем связь 2го и 3го, 
////////////////////////////////////связываем второй с четвёртым
pre->next->next=current;//pre->next - бывший третий элемент
/////////////////////////разрываем его связь с четвёртым
/////////////////////////и связываем со вторым
1
0 / 0 / 0
Регистрация: 22.04.2012
Сообщений: 16
22.04.2012, 16:16  [ТС]
Kuzia domovenok, не это не сортировка само собой Это я просто хочу поменять местами два элемента )

Эм.. почему ничего не происходит? Я думал раньше у меня у меня cerrent->next указывал, к примеру, на начало области памяти: 004C46A0. А теперь указывается на: 004C46E8, т.е. поэтому адресу у нас же другое значение хранится? Вот так я думал обмен осуществить..

Всёёё, понял, спасибо) Дополнение твое помогло)
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,532
Записей в блоге: 1
22.04.2012, 16:32
pre->next=current->next;
current->next=current->next->next;
pre->next->next=current;


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
...............pre......................current......
.................|.......................|
.................v......|----------v.....v.....|----v......|-------v......
.............|item1|next|....|item2|next|....|item3|next|....|item4|next|
 
pre->next=current->next;
...............pre.............current......
.................|...................|
.................v...................v........|-------v........|-------v......
.............|item1|next|....|item2|next|....|item3|next|....|item4|next|
..........................|----------------------^
 
current->next=current->next->next;
 
...............pre.............current......
.................|...................|.........----------------------------|
.................v...................v.......|......................|-------v.....v...
.............|item1|next|....|item2|next|....|item3|next|....|item4|next|
.........................|----------------------^
 
pre->next->next=current;
 
...............pre.............current......
.................|...................|........-------------------------|
.................v...................v......|.............................v...
............|item1|next|....|item2|next|....|item3|next|....|item4|next|
.......................|-------------------------^...|
.....................................^------------------|
 
и того 
item1->next=item3
item3->next=item2
item2->next=item4
что-то не удалась псевдографика, ладно, думаю и без неё понятно
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.04.2012, 16:32
Помогаю со студенческими работами здесь

Сортировка списка
Во время проведения олимпиады каждый из участников получил свой идентификационный номер – натуральное число. Необходимо отсортировать...

Сортировка списка
Всем привет задание такое Разработать программу работы со связным списком сеансов в кинотеатре. Для каждого сеанса должна храниться...

Сортировка списка
помогите сделать сортировку по возрасту, а то ничего не выходит #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; ...

Сортировка списка
Здравствуйте!!! Прошу помочь мне написать алгоритм сортировки односвязного списка. Задание такое: необходимо из элементов трёх списков...

Сортировка списка
Помогите пожалуйста, нужна сортировка методом вставок односвязанного кольцевого списка, не пойму как делать. Со списками ток начал...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru