Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 11.01.2017
Сообщений: 46
1

Как ускорить сортировку массива?

20.02.2017, 20:49. Показов 2670. Ответов 7
Метки c++ (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет есть задача по сортировке массива ,я её решил на 71.43%. Помогите довести до 100%.
Вот задача
Дано N (N <= 500000) целых чисел. Расположить в этом массиве в начале все положительные числа без изменения их взаимного расположения, затем нулевые элементы, затем отрицательные элементы также без изменения их взаимного расположения. Затем переставить элементы полученного массива в обратном порядке.

Входные данные

В первой строке находится число N. Во второй строке располагается N целых чисел (каждое число по абсолютной величине не превосходит 5000).

Входные данные

В первой строке вывести N, количество положительных чисел, количество нулей и количество отрицательных чисел. Во второй строке вывести полученный массив.



Пример входных данных

10
3 0 -3 5 2 -1 -2 4 7 1

Пример выходных данных

10 6 1 3
-2 -1 -3 0 1 7 4 2 5 3


Мой код
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
  int cis[MAXN],cntnol=0;
   vector<long long>pol;
 vector<long long>massiv;
   int otrcnt=0;
   vector<long long>otr;
   int n;
   cin>>n;
   for(int i=0;i<n;i++){
      cin>>cis[i];
   }
    for(int i=0;i<n;i++){
      if(cis[i]>0)pol.push_back(cis[i]);
      if(cis[i]==0)cntnol++;
      if(cis[i]<0){otr.push_back(cis[i]);otrcnt++;}
   }
   cout<<n<<" "<<pol.size()<<" "<<cntnol<<" "<<otrcnt<<endl;
    for(int i=otrcnt-1;i>=0;i--){
      cout<<otr[i]<<" ";
   }
 
    for(int i=0;i<cntnol;i++){
      cout<<"0"<<" ";
   }
    for(int i=pol.size()-1;i>=0;i--){
      cout<<pol[i]<<" ";
   }
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.02.2017, 20:49
Ответы с готовыми решениями:

Как ускорить пирамидальную сортировку?
Второй цикл for в пирамидальной сортировке можно было бы сократить, добавив условие завершения i &gt;...

Заменить сортировку массива на сортировку ссылками
Код работает. Необходимо заменить в M_F_3 сортировку по массиву на сортировку через ссылки. ...

Как организовать сортировку динамического массива
Ввести num - количество массивов. Ввести размерность очередного массива и его элементы типа double,...

Как сделать сортировку этого массива структур?
как сделать сортировку этого массива структур по name, autor и god? struct mas { char name; ...

7
63 / 63 / 39
Регистрация: 18.11.2016
Сообщений: 562
20.02.2017, 21:11 2
Хм, я конечно не специалист. Но может быть сначала сделать немного по другому.
1) Создать счетчик для положительного, отрицательного, и нулевого значения.
2) Пройтись по массиву.
3) Создать три массива под положительные, нулевые, отрицательные числа.
4) Занести в них числа.
5) Произвести сортировку без изменений в основной массив.
6) Удалить динамические массивы.
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
20.02.2017, 21:40 3
FC Programmer, вот примерный вариант самого тупого решения на плюсах:
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
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
 
using T = pair<int, size_t>;
 
int sign(int x) { return -(x < 0) + (x > 0); }
 
int main() {
    vector<int> X = {-1, 4, 6, 0, 2, -5, -7};
    vector<T> X2(X.size());
    for (size_t i = 0; i < X.size(); ++i)
        X2[i].first = X[i] , X2[i].second = i;
    cout << "Old: ";
    for (auto &it : X2)
        cout << it.first << " ";
    cout << endl;
    sort(X2.begin(), X2.end(), [](T &a, T &b) { return sign(a.first) < sign(b.first) || sign(a.first) == sign(b.first) && a.second < b.second; });
    cout << "Srt: ";
    for (auto &it : X2)
        cout << it.first << " ";
    cout << endl;
}
Сортируем массив по знакам чисел, а если знаки совпадают, то по порядковому номеру числа.

Добавлено через 11 минут
Ну и как всегда я не прочитал задание =)
FC Programmer, а чем собственно тебя не устраивает твое решение? В чем проблема?
0
0 / 0 / 0
Регистрация: 11.01.2017
Сообщений: 46
20.02.2017, 21:42  [ТС] 4
nonedark2008, оно защитывается 71.43%.
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
20.02.2017, 21:49 5
Лучший ответ Сообщение было отмечено FC Programmer как решение

Решение

FC Programmer, а с какой ошибкой не засчитывает?
Попробуй вынести массив cis на пределы функции main, либо вообще сделай его вектором.
Сделай в начале
C++
1
pol.reserve(MAXN); massiv.reserve(MAXN); otr.reserve(MAXN);
Надеюсь ты не по памяти вылетаешь

Добавлено через 2 минуты
Да и вообще массив cis тебе не нужен, объедини первые два цикла.
1
0 / 0 / 0
Регистрация: 11.01.2017
Сообщений: 46
20.02.2017, 22:21  [ТС] 6
nonedark2008, верно надо было соединить два цикла. Спасибо большое за помощь!
0
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
20.02.2017, 22:31 7
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
#include <iostream> 
 
using std::cout;
using std::cin;
using std::endl;
 
const int MAX_NUM=500000;
int negative_array[MAX_NUM];
int positive_array[MAX_NUM]={0};
 
int main()
{
int n, positive(0), negative(0), m;
    cout<<"How much? "; 
        cin>>n;
 
for(int i=0; i<n; i++){
    cout<<"enter  value with number "<<i+1<<" ";
        cin>>m;
            if(m){
                if(m<0)negative_array[negative++]=m;
                    else positive_array[positive++]=m;
                 }
}
 
 
int zeroes=n-positive-negative;
/* //отладочное
for(int i=0; i<positive; i++) cout<<positive_array[i]<<' ';
for(int i=0; i<zeroes; i++) cout<<0<<' ';
for(int i=0; i<negative; i++) cout<<negative_array[i]<<' ';
*/
cout<<'\n'<<n<<' '<<positive<<' '<<zeroes<<' '<<negative<<'\n';
 
for(int i=negative-1; i>-1 ; i--) cout<<negative_array[i]<<' ';
 
for(int i=0; i<zeroes; i++) cout<<0<<' ';
 
for(int i=positive-1; i>-1; i--) cout<<positive_array[i]<<' ';
 
cout<<endl;
cin.get();  
cin.get(); 
return 0;
}
0
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
21.02.2017, 00:28 8
Цитата Сообщение от Photofenix Посмотреть сообщение
Создать три массива под положительные, нулевые, отрицательные числа.
Под нулевые зачем массив то? Достаточно посчитать их количество
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
#include <iostream>
#include <deque>
#include <iterator>
 
int main()
{
    std::deque<int> pos;
    std::deque<int> neg;
    int null_count = 0;
 
    int n;
    std::cin >> n;
    for (int i = 0; i < n; i++)
    {
        int tmp;
        std::cin >> tmp;
        if (tmp > 0)
            pos.push_back(tmp);
        else if (tmp < 0)
            neg.push_back(tmp);
        else
            null_count++;
    }
 
    std::copy(neg.rbegin(), neg.rend(), std::ostream_iterator<int>(std::cout, " "));
 
    for (int i = 0; i < null_count; i++)
        std::cout << "0 ";
 
    std::copy(pos.rbegin(), pos.rend(), std::ostream_iterator<int>(std::cout, " "));
 
}
1
21.02.2017, 00:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.02.2017, 00:28
Помогаю со студенческими работами здесь

Подскажите как эту сортировку переделать в сортировку по алфавиту?
Подскажите как эту сортировку переделать в сортировку по алфавиту?? vector&lt;std::pair&lt;string,...

Сортировку вставками меняем на Пирамидальную сортировку и на Сортировку подсчётом
Здравствуйте. Я не как не могу разобраться.Помогите. У меня есть листинг сортировки вставками: ...

Как ускорить сортировку массива?
Здравствуйте. Решил проверить производительность Array.Sort и был сильно огорчен: сортировка 4.5...

Как ускорить сортировку?
У меня возникла проблема: мне нужно отсортировать... много чисел (около полутора миллиардов) с...


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

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