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

Сортировки - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.71
Temirlan90
 Аватар для Temirlan90
131 / 131 / 8
Регистрация: 30.09.2010
Сообщений: 333
15.11.2010, 13:33     Сортировки #1
Есть динамичный массив:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <ctime>
 
using namespace std;
 
int main() {
    setlocale(LC_ALL,"Russian");  
    srand((unsigned)time(NULL));
    int *arr;
    int size;
    cout << "Введите размер массива: ";
    cin >> size;
    arr = new int[size];    
    cout << "Сформированый массив: ";
    for(int i = 0; i < size; i++) {
        arr[i] = rand() % 9 + 1;
        cout << arr[i] << "  ";
    }   
    cout << endl;   
    delete [] arr;
    system("pause");
}
Мне надо его отсортировать 5 способами:
Insertion sort
Selection sort
Merge sort
Bubble sort
Quick sort
Уважаемые оставляйте комментарии в коде. В заранее благодарю.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Temirlan90
 Аватар для Temirlan90
131 / 131 / 8
Регистрация: 30.09.2010
Сообщений: 333
15.11.2010, 22:36  [ТС]     Сортировки #21
RUSya82, у меня на VS2010 не компилируется=( Вы на каком компиляторе запускали?
Unhandled exception at 0x00413ed7 in rr.exe: 0xC00000FD: Stack overflow.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
RUSya82
 Аватар для RUSya82
236 / 114 / 3
Регистрация: 15.10.2010
Сообщений: 395
15.11.2010, 23:03     Сортировки #22
Dev C++ 4.9.9.2
Компилируется нормально

Добавлено через 23 секунды
Переполнение стека у Вас

Добавлено через 2 минуты
Объявите double A[250000]; из 40 строки глобально, то есть вне функции main(). Должно пойти.
isaak
101 / 38 / 9
Регистрация: 17.10.2010
Сообщений: 634
15.11.2010, 23:39     Сортировки #23
RUSya82, а почему у меня компилятор ругается:
Error 1 error C2084: function 'int main(void)' already has a body c:\program files\microsoft sdks\windows\v6.0a\include\bcrypt.h 3 p786
Error 2 error C2146: syntax error : missing ';' before identifier 'NCryptBuffer' c:\program files\microsoft sdks\windows\v6.0a\include\ncrypt.h 111 p786
Error 3 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int c:\program files\microsoft sdks\windows\v6.0a\include\ncrypt.h 111 p786
Error 4 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int c:\program files\microsoft sdks\windows\v6.0a\include\ncrypt.h 111 p786
Error 5 error C2146: syntax error : missing ';' before identifier 'NCryptBufferDesc' c:\program files\microsoft sdks\windows\v6.0a\include\ncrypt.h 113 p786
Error 6 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int c:\program files\microsoft sdks\windows\v6.0a\include\ncrypt.h 113 p786
Error 7 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int c:\program files\microsoft sdks\windows\v6.0a\include\ncrypt.h 113 p786
Error 8 error C2061: syntax error : identifier 'NCryptBufferDesc' c:\program files\microsoft sdks\windows\v6.0a\include\ncrypt.h 447 p786
Error 9 error C2061: syntax error : identifier 'NCryptBufferDesc' c:\program files\microsoft sdks\windows\v6.0a\include\ncrypt.h 461 p786
Error 10 error C2061: syntax error : identifier 'NCryptBufferDesc' c:\program files\microsoft sdks\windows\v6.0a\include\ncrypt.h 557 p786
Error 11 error C2146: syntax error : missing ';' before identifier 'hCNGContentEncryptKey' c:\program files\microsoft sdks\windows\v6.0a\include\wincrypt.h 8161 p786
Error 12 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int c:\program files\microsoft sdks\windows\v6.0a\include\wincrypt.h 8161 p786
Error 13 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int c:\program files\microsoft sdks\windows\v6.0a\include\wincrypt.h 8161 p786
Error 14 error C2146: syntax error : missing ';' before identifier 'hCNGContentEncryptKey' c:\program files\microsoft sdks\windows\v6.0a\include\wincrypt.h 8542 p786
Error 15 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int c:\program files\microsoft sdks\windows\v6.0a\include\wincrypt.h 8542 p786
Error 16 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int c:\program files\microsoft sdks\windows\v6.0a\include\wincrypt.h 8542 p786
Error 17 error C2061: syntax error : identifier 'BCRYPT_KEY_HANDLE' c:\program files\microsoft sdks\windows\v6.0a\include\wincrypt.h 14115 p786
Error 18 error C2061: syntax error : identifier 'BCRYPT_KEY_HANDLE' c:\program files\microsoft sdks\windows\v6.0a\include\wincrypt.h 14129 p786
Error 19 error C3861: 'time': identifier not found c:\users\администратор\documents\visual studio 2008\projects\c++\console\p786\p786\p786.cpp 141 p786
Error 20 error C3861: 'time': identifier not found c:\users\администратор\documents\visual studio 2008\projects\c++\console\p786\p786\p786.cpp 160 p786
RUSya82
 Аватар для RUSya82
236 / 114 / 3
Регистрация: 15.10.2010
Сообщений: 395
16.11.2010, 13:32     Сортировки #24
хы, не знаю. я ВС не пользуюсь. Но в Dev c++ все ОК

Добавлено через 1 минуту
Цитата Сообщение от isaak Посмотреть сообщение
ncrypt.h
Это кто?

Добавлено через 3 часа 31 минуту
isaak, Мне кажется у вас какие то проблемы с CharToOem

Добавлено через 8 часов 12 минут
Temirlan90, Запустилась программа?
Temirlan90
 Аватар для Temirlan90
131 / 131 / 8
Регистрация: 30.09.2010
Сообщений: 333
16.11.2010, 14:11  [ТС]     Сортировки #25
Столкнулся с двумя видами поиска (Бинарный и Линейный), вот собственно исходники:
Бинарный (рекурсивный и не рекурсивный)
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
#include <stdio.h>
#include <conio.h>
#define MAX_LEN 10
 
/* Non-Recursive function*/
void b_search_nonrecursive(int l[],int num,int ele) {
    int l1, i, j, flag = 0;
    l1 = 0;
    i = num - 1;
    while(l1 <= i) {
        j = (l1 + i) / 2;
        if( l[j] == ele) {
            printf("\nThe element %d is present at position %d in list\n", ele, j);
            flag = 1;
            break;
        }
        else
            if(l[j] < ele)
                l1 = j + 1;
            else
                i = j - 1;
    }
    if( flag == 0)
        printf("\nThe element %d is not present in the list\n", ele);
}
 
/* Recursive function*/
int b_search_recursive(int l[], int arrayStart, int arrayEnd, int a) {
    int m, pos;
    if (arrayStart <= arrayEnd) {
        m = (arrayStart + arrayEnd) / 2;
        if (l[m] == a)
            return m;
        else 
            if (a < l[m])
                return b_search_recursive(l, arrayStart, m - 1, a);
            else
                return b_search_recursive(l, m + 1, arrayEnd, a);
    }
    return -1;
}
 
void read_list(int l[], int n) {
    int i;
    printf("\nEnter the elements:\n");
    for(i = 0; i < n; i++)
        scanf("%d", &l[i]);
}
 
void print_list(int l[], int n) {
    int i;
    for(i = 0; i < n; i++)
        printf("%d\t", l[i]);
}
 
/*main function*/
void main() {
    int l[MAX_LEN], num, ele, f, l1, a;
    int ch, pos;
    printf("======================================================");
    printf("\n\t\t\tMENU");
    printf("\n=====================================================");  
    printf("\n[1] Binary Search using Recursion method");  
    printf("\n[2] Binary Search using Non-Recursion method");  
    printf("\n\nEnter your Choice:");  
    scanf("%d",&ch); 
    if(ch <= 2 & ch > 0) { 
        printf("\nEnter the number of elements : ");  
        scanf("%d", &num);  
        read_list(l, num);  
        printf("\nElements present in the list are:\n\n");  
        print_list(l, num);  
        printf("\n\nEnter the element you want to search:\n\n");  
        scanf("%d", &ele);     
        switch(ch) {
        case 1:printf("\nRecursive method:\n");  
            pos = b_search_recursive(l, 0, num, ele);  
            if(pos == -1) {  
                printf("Element is not found");  
            }  
            else {  
                printf("Element is found at %d position", pos);  
            }  
            getch();   
            break;
        case 2:printf("\nNon-Recursive method:\n"); 
            b_search_nonrecursive(l, num, ele);
            getch();
            break;
        }
    }
    getch(); 
}
Линейный(рекурсивный и не рекурсивный)
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
#include <stdio.h>  
#include <conio.h>
#define MAX_LEN 10 
 
/* Non-Recursive method*/
void l_search_nonrecursive(int l[], int num, int ele) {
    int j, f = 0;
    for(j = 0; j < num; j++)
        if( l[j] == ele) {
            printf("\nThe element %d is present at position %d in list\n", ele, j);
            f = 1;
            break;
        }
        if(f == 0)
            printf("\nThe element is %d is not present in the list\n", ele);
}
 
/* Recursive method*/
void l_search_recursive(int l[], int num, int ele) {
    int f = 0;
    if( l[num] == ele) {
        printf("\nThe element %d is present at position %d in list\n", ele, num);  
        f = 1;
    }
    else {
        if((num == 0) && (f == 0)) {
            printf("The element %d is not found.", ele);
        }
        else {
            l_search_recursive(l, num - 1, ele);
        }
    }
    getch();
}
 
void read_list(int l[], int num) {
    int j;
    printf("\nEnter the elements:\n");
    for(j = 0; j < num; j++)
        scanf("%d", &l[j]);
}
 
void print_list(int l[], int num) {
    int j;
    for(j = 0; j < num; j++)
        printf("%d\t", l[j]);
} 
 
void main() {
    int l[MAX_LEN], num, ele;
    int ch;    
    printf("======================================================");  
    printf("\n\t\t\tMENU");  
    printf("\n=====================================================");  
    printf("\n[1] Linary Search using Recursion method");  
    printf("\n[2] Linary Search using Non-Recursion method");  
    printf("\n\nEnter your Choice:");  
    scanf("%d", &ch);    
    if(ch <= 2 & ch > 0) { 
        printf("Enter the number of elements :");  
        scanf("%d", &num);  
        read_list(l, num);  
        printf("\nElements present in the list are:\n\n");  
        print_list(l, num);  
        printf("\n\nElement you want to search:\n\n");  
        scanf("%d", &ele);    
        switch(ch) {  
        case 1:printf("\n**Recursion method**\n");  
            l_search_recursive(l, num, ele);  
            getch();  
            break;  
        case 2:printf("\n**Non-Recursion method**\n");  
            l_search_nonrecursive(l, num, ele);
            getch();  
            break;  
        }  
    }  
    getch();  
}  
/*end main*/
Кто нибудь расставите комментарии в двух данных исходниках. Заранее спасибо =)

Добавлено через 24 минуты
Temirlan90, Запустилась программа?
да, спасибо

RUSya82, как я понял, вы там все алгоритмы сравнивали которые я выкладывал?
RUSya82
 Аватар для RUSya82
236 / 114 / 3
Регистрация: 15.10.2010
Сообщений: 395
16.11.2010, 21:32     Сортировки #26
Цитата Сообщение от Temirlan90 Посмотреть сообщение
RUSya82, как я понял, вы там все алгоритмы сравнивали которые я выкладывал?
Нет, я просто предлагал свои решения.

Добавлено через 30 минут
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
/* Non-Recursive function*/
/*num - количество элементов
ele - поисковый элемент*/
void b_search_nonrecursive(int l[],int num,int ele) {
        int l1, i, j, flag = 0;
        l1 = 0;
        i = num - 1;
        while(l1 <= i) {//продолжаем, пока поиск не сузится до 1 элемента
                j = (l1 + i) / 2;//Делим массив пополам
                if( l[j] == ele) {//если середина и есть поисковый элемент, тогда говорим об этом
                        printf("\nThe element %d is present at position %d in list\n", ele, j);
                        flag = 1;
                        break;
                }
                else
                        if(l[j] < ele)//иначе выбираем для поиска тот полумассив, где вероятно находится
                                      //поисковый элемент
                                l1 = j + 1;
                        else
                                i = j - 1;
        }
        if( flag == 0)//если флаг не установлен, то элемент не найден
                printf("\nThe element %d is not present in the list\n", ele);
}
Добавлено через 8 минут
Ну а в линейном поиске итак все понятно, просто смотрим весь массив подряд, и проверяем, нет ли там поискового элемента)
Temirlan90
 Аватар для Temirlan90
131 / 131 / 8
Регистрация: 30.09.2010
Сообщений: 333
17.11.2010, 18:52  [ТС]     Сортировки #27
RUSya82, а как можно добавить туда что бы считало сколько мили секунд тратится на поиск?)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.11.2010, 21:22     Сортировки
Еще ссылки по теме:

Си++, Сортировки C++
C++ Сделать так, чтобы после сортировки вектора указатель показывал на тот же элемент, что и до сортировки
C++ Напишите функцию сортировки, похожую на функцию которая использовалась для сортировки массивов, с той разницей, что ее а

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

Или воспользуйтесь поиском по форуму:
RUSya82
 Аватар для RUSya82
236 / 114 / 3
Регистрация: 15.10.2010
Сообщений: 395
17.11.2010, 21:22     Сортировки #28
Можно. Так же, как и при сортировке. Объявляете две переменных типа SYSTEMTIME. например SYSTEMTIME st1, st2;
Функция GetLocalTime(&st1) - запишет в переменную текущее время. Т.о. записываешь время до запуска функции и после. То есть:
C++
1
2
3
GetLocalTime(&st1);
Function();
GetLocalTime(&st2);
Потом вычисляешь время и выводишь результат:
C++
1
2
3
4
5
double T1 = (double)(st1.wMinute*60*1000 + st1.wSecond*1000 + st1.wMilliseconds); //вычисляем время
     double T2 = (double)(st2.wMinute*60*1000 + st2.wSecond*1000 + st2.wMilliseconds);
     cout << endl << RUS("Для size = ") << size2[j] << "   \n" ;
     cout << RUS("время выполнения функции: ");
     cout << (T2 - T1) << RUS("   Миллисекунд") << endl;
Yandex
Объявления
17.11.2010, 21:22     Сортировки
Ответ Создать тему
Опции темы

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