Форум программистов, компьютерный форум CyberForum.ru

Ошибка в пирамидальной сортировке - C++

Восстановить пароль Регистрация
 
PaDyra
32 / 32 / 8
Регистрация: 06.01.2012
Сообщений: 142
19.03.2013, 20:54     Ошибка в пирамидальной сортировке #1
Здравствуйте, подскажите, пожалуйста, где ошибка, сортирует весь массив нормально, кроме одного числа которое находится на 5й позииции, в чем ошибка?? Заранее спс.

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
 
#include < stdio.h>
#include < stdlib.h>
 
  //Параметры: array - массив,
  // i - начало подмножества (корень дерева)
  // k - конец подмножества (последний лист дерева)
 
void Surface(int array[], int i, int k)
{ 
 
 
   int copy = array[i];
     
  int m = 2*i+1, j = 0;
  while(m <= k){ 
   
    if(m == k) j = m; 
      
      else if(array[m] > array[m+1]) j = m;
        
        else j = m + 1;
    
    if(array[j] > copy) {
      array[i] = array[j];     
      i = j;     
      m = 2*i+1; 
    } else break; 
  }
   
  array[i] = copy;      
}
 
 
void FloidSort(int array[], int num)
{
 
  for(int i= num / 2; i > 0; i--) Surface(array,i,num);
  
  for(int k=num-1;k>0;k--){
   
    Surface(array,0,k);
    
    int tmp  = array[k]; 
    array[k] = array[0];  
    array[0] = tmp;       
  }
}
 
 
 int main(void)
 {
    int arr[10]={10,9,8,7,6,5,4,3,2,1};
    printf("Do sort\n");
    for(int i = 0; i < 10; i++)
     {
        printf("%d ",arr[i]);
     }
    
    FloidSort(arr, 10);
    printf("Posle sort \n");
     for(int i = 0; i < 10; i++)
     {
        printf("%d ",arr[i]);
     }
      
  
 return 0 ;
 }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.03.2013, 20:54     Ошибка в пирамидальной сортировке
Посмотрите здесь:

Ошибка в сортировке\выводе массива C++
C++ Ошибка в порязрядной сортировке?!
C++ Ошибка в сортировке
Ошибка в сортировке C++
C++ Ошибка в быстрой сортировке
Структыру.Ошибка в сортировке C++
C++ Ошибка при сортировке Шелла
C++ Найти ошибку в пирамидальной сортировке

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
anmartex
...
 Аватар для anmartex
1700 / 1193 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
20.03.2013, 08:05     Ошибка в пирамидальной сортировке #2
Ошибки:
  • Строка 16: Должно быть while(m < k), т.к. k - это размерность, а m - это индекс (ваша запись для pascal-я верна, но не для C/C++)
  • Строка 38: i передаваемое функции Surface должно быть не 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
#include <stdio.h>
#include <stdlib.h>
 
//Параметры: array - массив,
// i - начало подмножества (корень дерева)
// k - конец подмножества (последний лист дерева)
 
void Surface(int array[], int i, int k)
{
   int copy = array[i];
 
   int m = 2 * i + 1, j = 0;
 
   while (m < k)
   {
      if (m == (k-1))
      {
         j = m;
      }
      else if (array[m] > array[m + 1])
      {
         j = m;
      }
      else
      {
         j = m + 1;
      }
 
      if (array[j] > copy)
      {
         array[i] = array[j];
         i = j;
         m = 2 * i + 1;
      }
      else
      {
         break;
      }
   }
 
   array[i] = copy;
}
 
 
void FloidSort(int array[], int num)
{
   for (int i = num / 2; i > 0; i--)
   {
      Surface(array, i-1, num);
   }
 
   for (int k = num - 1; k > 0; k--)
   {
 
      Surface(array, 0, k);
 
      int tmp  = array[k];
      array[k] = array[0];
      array[0] = tmp;
   }
}
 
 
int main(void)
{
   int arr[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
   int size = sizeof(arr) / sizeof(*arr);
   printf("Do sort\n");
   for (int i = 0; i < size; i++)
   {
      printf("%d ", arr[i]);
   }
   printf("\n");
 
   FloidSort(arr, size);
   printf("Posle sort\n");
   for (int i = 0; i < size; i++)
   {
      printf("%d ", arr[i]);
   }
   printf("\n");
 
   system("pause");
 
   return 0 ;
}
Ошибка в пирамидальной сортировке

Бинарник + исходник: program.7z
Yandex
Объявления
20.03.2013, 08:05     Ошибка в пирамидальной сортировке
Ответ Создать тему
Опции темы

Текущее время: 07:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru