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

Сортировка подсчетом с++ - C++

Восстановить пароль Регистрация
 
Tima0406
0 / 0 / 0
Регистрация: 26.10.2013
Сообщений: 4
26.10.2013, 00:44     Сортировка подсчетом с++ #1
Всем привет. Есть такая проблемка. vs2010 выдает "Прекращена работа программы". Задание - ввод данных в массив, его нужно отсортировать сортировкой подсчетом и применить бинарный поиск к отсортированному массиву. После ввода данных вылетает "Прекращена работа программы". Бинарный поиск работает верно. Помогите, пожалуйста!!
Код на с++:

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
#include <iostream>
using namespace std;
 
class CountingSort
{
public:
    int N;
    int M;
    int *arr;
    int *temp;
    int *out;
    int number;
     CountingSort()
    {
        cout<< "Input number of keys from 0 up to 255: \n";
        cin>> N;
        cout<< "Input number of keys from output: \n";
        cin>> M;
        arr = new int[N];
    }
    void input();
    void Counting_Sort();
    int binary(int);
    void output();
};
 
void CountingSort::input()
{
    cout<< "Input keys: \n";
    
    for (int i = 0; i< N; i++)
    {
        cin>>arr[i];
    }
    cout<< "Initial array: \n";
    for (int i = 0; i< N; i++)
        cout<<arr[i] << "  ";
}
 
void CountingSort::Counting_Sort()
{    
    
 
    number = 256;
    for(int i=0;i<=number;i++)
        temp[i]=0;
    for(int j=0;j<N;j++)
        temp[arr[j]]=temp[arr[j]]+1;
    for(int i=1;i<=number;i++)
        temp[i]=temp[i]+temp[i-1];
    for(int j=N-1;j>=0;j--){
        out[temp[arr[j]]-1]=arr[j];
        temp[arr[j]]=temp[arr[j]]-1;
   
        free(out);
        free(temp);
        
    }
}
 
int CountingSort::binary(int x)
{
    int low, high, mid;
 
low = 0;
high = N - 1;
while(low <= high)
    {
mid = (low + high) / 2; 
if(x <arr[mid])              
high = mid - 1;
else if(x >arr[mid])
low = mid + 1;
else
return mid;
    }
return -1;
}
 
void CountingSort::output()
{int k;
    cout<< "\n" << "Sorted array: \n";
    for (int i = 0; i< N; i++)
 
        cout<<out[i] << "  ";
    for (int j = 0; j < M; j++)
    {
        cout<< "\n" << "Input key for search: \n";
        cin>> k;
        if(binary(k) < 0)
            cout<< "There is no such key!\n";
        else
            cout<< "The index of the key is: " << binary(k) + 1 << "\n";
    }
}
 
int main()
{
    CountingSort cs;
    cs.input();
    cs.Counting_Sort();
    cs.output();
}
Заранее Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.10.2013, 00:44     Сортировка подсчетом с++
Посмотрите здесь:

C++ Сортировка распределяющим подсчетом
C++ Сортировка подсчетом и LSD сортировка
C++ помогите с подсчетом букв.
C++ Сортировка подсчетом
сортировка подсчетом! C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Shtirliz72
200 / 160 / 38
Регистрация: 25.10.2013
Сообщений: 527
26.10.2013, 01:36     Сортировка подсчетом с++ #2
Цитата Сообщение от Tima0406 Посмотреть сообщение
Всем привет. Есть такая проблемка. vs2010 выдает "Прекращена работа программы". Задание - ввод данных в массив, его нужно отсортировать сортировкой подсчетом и применить бинарный поиск к отсортированному массиву. После ввода данных вылетает "Прекращена работа программы". Бинарный поиск работает верно. Помогите, пожалуйста!!
Где у тебя инициализация temp?
Где у тебя инициализация out?
Зачем ты используешь функцию free() при том что она применяется только с malloc()?
Почему память для arr с помощью new выделяется, но нигде не освобождается с помощью delete?
А вообще - странно что у тебя программа вообще запускается. Установи нормальную IDE, там большинство ошибок ещё на этапе сборки вскроются.
reisal78
 Аватар для reisal78
603 / 516 / 119
Регистрация: 28.04.2013
Сообщений: 1,451
26.10.2013, 01:37     Сортировка подсчетом с++ #3
Особо вникать влом, но судя по всему Вы в 46 строке вылезаете за пределы массива, потому и вылет
Tima0406
0 / 0 / 0
Регистрация: 26.10.2013
Сообщений: 4
26.10.2013, 01:41  [ТС]     Сортировка подсчетом с++ #4
А как сделать так, чтобы не вылезать?
Shtirliz72
200 / 160 / 38
Регистрация: 25.10.2013
Сообщений: 527
26.10.2013, 01:56     Сортировка подсчетом с++ #5
Цитата Сообщение от Tima0406 Посмотреть сообщение
А как сделать так, чтобы не вылезать?
У тебя происходит выход за пределы массива просто потому что этого самого массива не существует и указатель ссылается на случайное место. Поэтому либо выдели память под массив для этого указателя, либо скопируй в указатель адрес уже существующего массива. Советую почитать про организацию памяти: new и delete(или malloc и free). А также что такое указатели.
reisal78
 Аватар для reisal78
603 / 516 / 119
Регистрация: 28.04.2013
Сообщений: 1,451
26.10.2013, 01:57     Сортировка подсчетом с++ #6
C++
1
2
3
number = 256;
    for(int i=0;i<=number;i++)
        temp[i]=0;
А в чем смысл этих строк?
Yandex
Объявления
26.10.2013, 01:57     Сортировка подсчетом с++
Ответ Создать тему
Опции темы

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