13 / 13 / 0
Регистрация: 17.05.2012
Сообщений: 80
1

Алгоритм сортировки

17.05.2012, 08:44. Показов 3376. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
пацаны ребята помогите, реализовал два алгоритма на C++, алгоритм сортировки пирамидальный(кучей) и быстрой сортировки, все они сортируют массив в любом случае, но иногда например ввожу последовательность 2 1 3 45 12 5 23 6 4 89 2 он ее сортирует так: 0 1 2 2 3 4 5 12 23 45 и все и не дописывает в конце последний элемент, если на выходи когда массив уже отсортирован в цикле когда его отображаю, число итераций увеличить на единицу т е итераций больше чем размер массива, то тогда все получается и он дописывает недостающий символ в конце, но нуль остается в самом начале. вопрос, почему появляется нуль и как от него избавиться? спасибо

вот код:

быстрая сортировка:

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>
using namespace std;
 
void qicksort(int *a, int p, int r);
int partition(int *a, int p, int r);
 
int main(int argc, char *argv[])
{
 
    int *a;
    int size;
 
    cin >> size;
 
    a=new int (size);
 
    for(int i=0; i<size; i++)
    {
        cin >> a[i];
    }
 
    qicksort(a,0,size);
 
    for(int i=0; i<size; i++)
    {
        cout << a[i] << " ";
    }
 
    return 0;
}
 
void qicksort(int *a, int p, int r)
{
 
    int q;
 
    if(p<r)
    {
        q=partition(a,p,r);
        qicksort(a,p,q-1);
        qicksort(a,q+1,r);
    }
 
}
 
int partition(int *a, int p, int r)
{
 
    int t,k,x,i;
 
    x=a[r];
    i=p-1;
 
    for(int j=p; j<=(r-1); j++)
    {
        if(a[j]<=x)
        {
            i++;
            t=a[i];
            a[i]=a[j];
            a[j]=t;
        }
    }
 
    k=a[i+1];
    a[i+1]=a[r];
    a[r]=k;
 
    return (i+1);
 
}
сортировка кучей или пирамидальная:

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include <iostream>
using namespace std;
 
void max_heapify(int *a, int i, int size);
void build_max_heap(int *a, int i, int size);
void heapsort(int *a, int i, int size);
int parent(int i);
int left(int i);
int right(int i);
 
int main(int argc, char *argv[])
{
    int *a;
    int size,i;
 
    cin >> size;
 
    i=0;
 
    a=new int(size);
 
    for(int i=0; i<size; i++)
    {
        cin >> a[i];
    }
 
    heapsort(a,i,size);
 
    for(i=0; i<size; i++)
    {
        cout << a[i] << " ";
    }
 
    delete [] a;
 
    return 0;
}
 
int parent(int i)
{
    return (i/2);
}
 
int left(int i)
{
    return (2*i);
}
 
int right(int i)
{
    return ((2*i)+1);
}
 
void max_heapify(int *a, int i, int size)
{
    int l,r;
    int largest;
    int t=0;
 
    l=left(i);
    r=right(i);
 
    if((l<=size) && (a[l]>a[i]))
    {
        largest=l;
    }
    else
    {
        largest=i;
    }
 
    if((r<=size) && (a[r]>a[largest]))
    {
        largest=r;
    }
 
    if(largest!=i)
    {
        t=a[i];
        a[i]=a[largest];
        a[largest]=t;
        max_heapify(a,largest,size);
    }
}
 
void build_max_heap(int *a, int i, int size)
{
    i=size;
 
    for(int i=(size/2); i>=0; i--)
    {
        max_heapify(a,i,size);
    }
}
 
void heapsort(int *a, int i, int size)
{
    int t=0;
 
    build_max_heap(a,i,size);
 
    for(int i=size; i>=1; i--)
    {
        t=a[0];
        a[0]=a[i];
        a[i]=t;
        size=size-1;
        max_heapify(a,0,size);
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.05.2012, 08:44
Ответы с готовыми решениями:

Алгоритм сортировки
учитель попросил написать сортировку массива по возрастанию в общем виде #include &lt;stdio.h&gt;...

Алгоритм сортировки
Здравствуйте, подскажите пожалуйста какой алгоритм можно использовать при решении такой задачи:...

Алгоритм сортировки
Дан одномерный масив. мне в нем нужно отсортировать по возростанию только те числа масива которые...

Алгоритм пузырьковой сортировки
#include&lt;iostream.h&gt; #define SIZE 5 void bsort (int iArray, int n); int main() { char ch;...

21
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
17.05.2012, 10:37 2
идет обращение к элементу a[size]
0
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
17.05.2012, 10:50 3
Дебаг юзайте и смотрите пошагово, сейчас сам попробую =)

Добавлено через 6 минут
Цитата Сообщение от MrGluck Посмотреть сообщение
например ввожу последовательность 2 1 3 45 12 5 23 6 4 89 2
вы вводите 11 2 1 3 45 12 5 23 6 4 89 2, а не 2 1 3 45 12 5 23 6 4 89 2
0
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
17.05.2012, 11:00 4
Вот, что мне выдаёт консоль, в обоих случаях
Миниатюры
Алгоритм сортировки  
0
13 / 13 / 0
Регистрация: 17.05.2012
Сообщений: 80
17.05.2012, 11:06  [ТС] 5
Цитата Сообщение от MrGluck Посмотреть сообщение
идет обращение к элементу a[size]
и что дальше?

Добавлено через 1 минуту
Цитата Сообщение от Ternsip Посмотреть сообщение
Вот, что мне выдаёт консоль
вот и я про что
только у меня перед первым элементом еще нуль выскакивает
а если увеличить на выходе массив на единицу то он дописывает недописанный элемент, но нуль останется

Добавлено через 3 минуты
Цитата Сообщение от Ternsip Посмотреть сообщение
Вот, что мне выдаёт консоль, в обоих случаях
попробуй другие входные данные, на элементов 20
0
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
17.05.2012, 11:08 6
Цитата Сообщение от mmd Посмотреть сообщение
попробуй другие входные данные, на элементов 20
Магия, компиляторы разные, но у меня всё ок и на 20 тоже
0
13 / 13 / 0
Регистрация: 17.05.2012
Сообщений: 80
17.05.2012, 11:10  [ТС] 7
Цитата Сообщение от Ternsip Посмотреть сообщение
Магия, компиляторы разные, но у меня всё ок и на 20 тоже
я на Qt пишу и на VisualStudio и все равно такая же проблема
0
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
17.05.2012, 11:13 8
Delphi/Pascal поймёте ? у меня на них есть реализация этих сортировок
0
13 / 13 / 0
Регистрация: 17.05.2012
Сообщений: 80
17.05.2012, 11:14  [ТС] 9
Цитата Сообщение от Ternsip Посмотреть сообщение
Delphi/Pascal поймёте ? у меня на них есть реализация этих сортировок
Pascal пойму


кстати, если запускаю экзешник, т е не из компилятора то все работает нормально, что за бред?
0
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
17.05.2012, 11:17 10
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Procedure QSort(l, r: integer);
Var i, j, x,temp: integer;
begin
  i := l;
  j := r;
  x := Mas[l + random(r - l)];
  While i < j do
  begin
    While Mas[i] < x do inc(i);
    While Mas[j] > x do dec(j);
    if i <= j then
    begin
      temp:=Mas[i];Mas[i]:=Mas[j];Mas[j]:=temp;
      inc(i); dec(j);
    end;
  end;
  if i < r then QSort(i, r);
  if l < j then QSort(l, j);
end;
 
 
  Qsort(0,ArrayLen-1); //сортим массив mas, нумеруется с 0 до n-1
Добавлено через 1 минуту
Delphi
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
procedure Swap(i,j:integer);
var e:integer;
begin
    e:=Mas[i];
    Mas[i]:=Mas[j];
    Mas[j]:=e;
end;
procedure DownHeap(k,p:longint);
var ch, g: longint;
begin
  g:=Mas[k];
  while k<=p/2 do
     begin
        ch:=2*k;
        if (ch<p)and(Mas[ch]<Mas[ch+1]) then inc(ch);
        if (g>=Mas[ch]) then break;
        Mas[k]:=Mas[ch];
        k:=ch;
     end;
  Mas[k]:=g;
end;
 
procedure HeapSortTime;
var i,time:integer;
begin
   for i:=trunc(ArrayLen/2) downto 1 do DownHeap(i,ArrayLen);
   for i:=ArrayLen downto 2 do
      begin
         swap(i, 1);
         DownHeap(1,i-1);
      end;
end;
Добавлено через 1 минуту
1-я быстрая сортировка, 2-я пирамидой, массив нумеруется с 0 до N-1 в обоих случаях
// longint =integer
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
17.05.2012, 11:19 11
Цитата Сообщение от mmd Посмотреть сообщение
и что дальше?
когда вы объявляете массив a[N], вы фактически создаете a[0], a[1], ... a[N-1] (всего N элементов) По адресу a[N] находится мусор, т.к. этот элемент не существует.
0
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
17.05.2012, 11:21 12
Цитата Сообщение от MrGluck Посмотреть сообщение
когда вы объявляете массив a[N], вы фактически создаете a[0], a[1], ... a[N-1] (всего N элементов) По адресу a[N] находится мусор, т.к. этот элемент не существует.
Вы всё правильно говорите, но не по делу, где в коде это обращение?
0
13 / 13 / 0
Регистрация: 17.05.2012
Сообщений: 80
17.05.2012, 13:11  [ТС] 13
так ведь там и цикл на выходе в главной функции i=0; i<size - это и есть size-1

Добавлено через 3 минуты
Цитата Сообщение от MrGluck Посмотреть сообщение
когда вы объявляете массив a[N], вы фактически создаете a[0], a[1], ... a[N-1] (всего N элементов) По адресу a[N] находится мусор, т.к. этот элемент не существует.
если увеличить на выходи массив то в этот мусор как раз и записывается то значение которое не выводится

Добавлено через 2 минуты
Цитата Сообщение от Ternsip Посмотреть сообщение
Вы всё правильно говорите, но не по делу, где в коде это обращение?
C++ (Qt)
1
2
3
4
for(i=0; i<size; i++)
 {
 cout << a[i] << " ";
 }
а если вот так написать
C++ (Qt)
1
2
3
4
for(i=0; i<size+1; i++)
 {
 cout << a[i] << " ";
 }
то все правильно, но нуль в самом начале все равно есть
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
17.05.2012, 16:49 14
Цитата Сообщение от Ternsip Посмотреть сообщение
Вы всё правильно говорите, но не по делу, где в коде это обращение?
C++
1
2
3
4
5
cin >> size;
a=new int (size); // a[size]
qicksort(a,0,size);
q=partition(a,p,r); // в функции quicksort (r = size)
x=a[r]; // в функции partition (r = size)
0
13 / 13 / 0
Регистрация: 17.05.2012
Сообщений: 80
17.05.2012, 17:13  [ТС] 15
Цитата Сообщение от MrGluck Посмотреть сообщение
C++
1
2
3
4
5
cin >> size;
a=new int (size); // a[size]
qicksort(a,0,size);
q=partition(a,p,r); // в функции quicksort (r = size)
x=a[r]; // в функции partition (r = size)
ппц я это знаю, что дальше то!? я так понял никто не может ответить на вопрос
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
17.05.2012, 17:35 16
Цитата Сообщение от mmd Посмотреть сообщение
ппц я это знаю, что дальше то!? я так понял никто не может ответить на вопрос
элемента arr[N] не существует, т.к. индексация начинается с 0, а вы к нему обращаетесь
0
13 / 13 / 0
Регистрация: 17.05.2012
Сообщений: 80
17.05.2012, 17:50  [ТС] 17
Цитата Сообщение от MrGluck Посмотреть сообщение
элемента arr[N] не существует, т.к. индексация начинается с 0, а вы к нему обращаетесь
да ничего не помогает все равно
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
17.05.2012, 18:12 18
посмотрел только первую сортировку (и даже не до конца) (см. коментарии):
Например size равно 10. Индексы максива a[] в диапазоне 0..9 (т.е. можно так: a[0] или так a[9], но нельзя a[10] или a[-1]). Больше или меньше индексы - выход за границы массива.
Цитата Сообщение от mmd Посмотреть сообщение
qicksort(a,0,size);//Здесь size равно 10 (для нашего случая)
Цитата Сообщение от mmd Посмотреть сообщение
void qicksort(int *a, int p, int r)// здесь r равно 10
{
int q;
if(p<r)
{
q=partition(a,p,r);// здесь r равно 10
Цитата Сообщение от mmd Посмотреть сообщение
int partition(int *a, int p, int r)// здесь r равно 10
{
int t,k,x,i;
x=a[r];// а вот здесь обращаемся к несуществующему элементу массива (выход за границы массива)
1
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
17.05.2012, 18:17 19
Цитата Сообщение от valeriikozlov Посмотреть сообщение
посмотрел только первую сортировку (и даже не до конца) (см. коментарии):
Например size равно 10. Индексы максива a[] в диапазоне 0..9 (т.е. можно так: a[0] или так a[9], но нельзя a[10] или a[-1]). Больше или меньше индексы - выход за границы массива.
я ему еще в прошлой теме это объяснял по несколько раз, его ответ - "И чё?"

P.S. не стоит дублировать темы Алгоритм сортировки
0
13 / 13 / 0
Регистрация: 17.05.2012
Сообщений: 80
17.05.2012, 22:13  [ТС] 20
все заработало
спасибочки всем
0
17.05.2012, 22:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.05.2012, 22:13
Помогаю со студенческими работами здесь

Алгоритм сортировки Шелла
http://lord-n.narod.ru/download/books/walla/programming/Spr_po_C/21/2107.htm здесь сказано, что...

Обобщенный алгоритм сортировки
как это можно сделать??? необходимо модифицировать шаблонный класс связного списка: добавить...

Не алгоритм быстрой сортировки
Просто как подключить эту функцию Не работаеееет #include&lt;iostream&gt; #include&lt;iomanip&gt; #include...

Алгоритм сортировки Шелла
Расписать по шагам сортровку массива с помощью алгоритма сортировки...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru