Сортировка пузырьком с++

  • Автор темы FroLe
  • Дата начала
F

FroLe

#1
Сортировка пузырьком, все работает, но помогите поменять ввод цифр в ручную на ввод цифр рандома (от -100 до +100).
Код:
#include <iostream>
using namespace std;
// наш массив
int array[100];
// сортировка
void*Sort(int col) 
{ 
// временная переменная для хранения промежуточного результата
int trash=0; 
// пока не равно количеству елементов
for (int i=1; i<=col; i++)
{
// пока не равно col-i
for (int j=1; j<=col-i; j++) 
{
// если левый элемент больше
if (array [j]>array [j+1]) 
{
// правого, то меняем их местами
trash=array[j]; 
array [j]=array [j+1];
array [j+1]=trash;
}
}
}
}
// вывод на экран нашего массива после сортировки
void*Out(int col) 
{
for (int i=1; i<=col; i++) 
cout << array [i] <<" ";
cout << endl; 
}
int main()
{
int col_el;
cout << " Enter length of array"<< endl;
// считываем количество элементов
cin >> col_el;
// считываем элементы массива
for (int n=1; n<=col_el; n++) 
cin >> array[n];
Sort(col_el); 
// сортируем их
cout << "Result is :"<<endl; 
// и выводим 
Out(col_el);
// ждем нажатия клавиши
cin >> col_el; 
return 0;
}
 

lazybiz

Well-known member
03.11.2010
1 339
0
#2
C++:
#include <stdlib.h>

...

int main()
{
for ( int i = 0; i < 100; i++ ) {
array[i] = rand() % 200 - 100;
}

Sort(col_el); 
// сортируем их
cout << "Result is :"<<endl; 
// и выводим 
Out(col_el);
// ждем нажатия клавиши
cin >> col_el; 
return 0;
}
 
E

ermackprogramis

#3
Если я правильно понял что бы вводимые элементы генерировальсь сами.Если да то попробу так:
Подключи эти две:
C++:
#include <stdlib.h>
#include <time.h>
C++:
и потом это:
C++:
//инициализировать генератор псевдослучайных чисел
srand((unsigned)(time(NULL)));
for(int i=0;i<n;i++) //генерировать массив
{
arr=rand()%30; // имя твоего масива,%30 в скольких десятках будет числа брать
}
C++:
Вроде так,если что не так извини я пока новенький в этом.
 
F

FroLe

#4
спс lazybiz
мне одногрупник почти также подсказал))

C++:
 srand(1000);
for (int n=1; n<=col_el; n++) 
{
array[n]=rand()%201-100;
cout << array[n] <<' ';
}
 
F

FroLe

#5
а сложно будет разпарелелить такую программу в несколько потоков? с помощью библиотеки pthreads) кто поможет?))
 
R

Rififi

#7
FroLe

а сложно будет разпарелелить такую программу в несколько потоков?

в принципе, внутренние циклы можно было бы выполнять параллельно, хотя смысла в этом никакого нет. ну если только препода ублажить.
 
F

FroLe

#8
ну да превода ублажить нужно, он хотит что бы 1 поток сортировал с -100 до 0 , второй поток сортировал с 1 до 100, а в главном потоке идет ввод и вывод данных
 
R

Rififi

#9
FroLe


он хотит что бы 1 поток сортировал с -100 до 0 , второй поток сортировал с 1 до 100

он что, умом тронулся, на почве чрезмерного употребления алкоголе-содержащих напитков в преддверие праздников? ((:)
как мы можем сортировать в каком-то диапазоне, если входные данные - случайны???

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

FroLe

#10
ну может я чето не так понял )) может и действительно нужно сделать так как говоришь....
 
E
#11
а сложно будет разпарелелить такую программу в несколько потоков?
ну теоретически заполнение массива рандомными числами можно разпаралелить :)
например в одном потоке заполнять парные числа, в другом непарные.
 
D

dreamer

#12
При больших массивах в самом деле было бы очень кстати распараллелить сортировку подмассивов. Потом всё собирается в один массив через нахождение минимального (или максимального) элемента по указателям, последовательно перемещаемым вперёд по подмассивам.
 
E
#13
При больших массивах в самом деле было бы очень кстати распараллелить сортировку подмассивов. Потом всё собирается в один массив через нахождение минимального (или максимального) элемента по указателям, последовательно перемещаемым вперёд по подмассивам.
не понимаю как реализовать такое :ya_lamo: опишите словами алгоритм, если не сложно
 
D

dreamer

#14
Допустим, есть массив из чисел 19 3 1 44 7 0 56 1 1 3 11 6. Разобьём сортировку на 3 потока (т.е. сортируем 3 подмассива). После этого получится: 1 3 19 44 0 1 7 56 1 3 6 11. Ставим указатели на каждый из подмассивов. Первый вначале будет указывать на 1, второй на 0, третий на 1. Сравниваем, минимальным оказывается 0. Переносим его в результирующий массив, а соответствующий указатель увеличиваем. Получается опять три числа: 1 1 1. Тут берём любое, например, первое число (ибо все равны), заносим в результирующий массив и увеличиваем первый указатель. Получается 3 1 1. И так далее. После чего в результирующем массиве будет отсортированный исходный массив.

Только при этом нужно проверять, не стоит ли указатель за границами своего подмассива.