Премини към съдържанието

Препоръчан отговор


 
Да се създаде програма, която позволява да се въведе размер на масив и на стойностите на неговите елемтни и после да ги подреди така, че стойностите на елементите да нарастват от началото до средата и след това отново да намаляват до края. Примерен вход :   7, 4, 5, 2, 6, 1, 3Примерен изход:  4, 5, 7, 2, 6, 3, 1
#include <iostream>using namespace std;int main(){    int size,smallest,j;    cin >> size;    int *myArray = new int [size];    for(int i=0; i<size;i++)    {            cin >> myArray[i];            }        for(int passes=0;passes<size/2; passes++)    {                 for(j=0;j<size/2-passes-1;j++)                 {                          if(myArray[j]<myArray[j+1])                          {                                    smallest=myArray[j];                                    myArray[j]=myArray[j+1];                                    myArray[j+1]=smallest;                                           }                                 }        cout << myArray[j]<<",";    }         for(int i=0; i<size;i++)    {            cin >> myArray[i];            }        for(int passes=size/2;passes<size; passes++)    {                 for(j=size-1;j>size/2;j--)                 {                          if(myArray[j]<myArray[j-1])                          {                                    smallest=myArray[j];                                    myArray[j]=myArray[j-1];                                    myArray[j-1]=smallest;                                           }                                 }        cout << myArray[j]<<",";    }                        system("PAUSE");    return EXIT_SUCCESS;}

Не мога да обърна цикъла и да ми подреди втората част във низходящ ред.

 

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Здравейте ! Проблемите по кода са няколко. Моля, прегледайте inline забележките, разписани като коментари по него: 

Примерен вход :   7, 4, 5, 2, 6, 1, 3Примерен изход:  4, 5, 7, 2, 6, 3, 1

#include <iostream>using namespace std;int main(){    int size,smallest,j;    cin >> size;    int *myArray = new int [size];    for(int i=0; i<size;i++)    {            cin >> myArray[i];            }        for(int passes=0;passes<size/2; passes++)    {                 for(j=0;j<size/2-passes-1;j++)                 {                          if(myArray[j]<myArray[j+1]) // Трябва да е >                          {                                    smallest=myArray[j];                                    myArray[j]=myArray[j+1];                                    myArray[j+1]=smallest;                                           }                                 }        cout << myArray[j]<<","; //Това е добре да се махне. Няма гаранция, че ще се изведат в правилната последователност числата    }    //Защо въвеждаме наново ? Това е излишно и изключително грешно.    for(int i=0; i<size;i++)    {            cin >> myArray[i];    }    //Тук трябва да имаме предвид дали size е четно или не    //По примерите, които сте дал, излиза, че при нечетен брой числа,    //средното число не попада в никоя подредба.    //Поради това долния цикъл трябва да е:    //for(int passes= (size/2 + size%2);passes<size; passes++)    for(int passes=size/2;passes<size; passes++)    {                 //Горното важи и за тук:                 //for(j=size-1;j>(size/2 + size%2);j--)                 for(j=size-1;j>size/2;j--)                 {                          if(myArray[j]<myArray[j-1]) // Знака трябва да бъде > (сравнявате текущото с предходното)                          {                                    smallest=myArray[j];                                    myArray[j]=myArray[j-1];                                    myArray[j-1]=smallest;                                           }                                 }        cout << myArray[j]<<","; //Това е добре да се махне. Няма гаранция, че ще се изведат в правилната последователност числата    }        //Тук трябва да се добави принтиране на целия масив:    for (int i = 0; i < size; i++)    {        cout << myArray[i] << " ";    }    system("PAUSE");     return EXIT_SUCCESS; }

Ще приложа и коригирания код като спойлер в коментара си, ако Ви трябва по - точна референция. Поздрави !

 

P.S. Може да промените заглавието на темата на нещо по - конкретно, като например "Проблем със сортиране на масив" и нещо подобно. Не съм напълно убеден, че текущото заглавие е според правилата на форума ...

 

#include <iostream>using namespace std;int main(){    int size,smallest,j;    cin >> size;    int *myArray = new int [size];    for(int i=0; i<size;i++){		cin >> myArray[i];	}        for(int passes=0;passes<size/2; passes++){		for(j=0;j<size/2-passes-1;j++){			if(myArray[j] > myArray[j+1]){				smallest=myArray[j];				myArray[j]=myArray[j+1];				myArray[j+1]=smallest;                 			}                		}    }       for(int passes=(size/2 + size%2); passes < size; passes++){		for(j=size-1;j>(size/2 + size%2);j--){			if(myArray[j] > myArray[j-1]){				smallest=myArray[j];				myArray[j]=myArray[j-1];				myArray[j-1]=smallest;                 			}                		}    }        for (int i = 0; i < size; i++){		cout << myArray[i] << " ";	}            system("PAUSE");    return EXIT_SUCCESS;}

 

Редактирано от soundtracker (преглед на промените)
  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Нещо не ми харесват сортиранията -май е почнато с метода на пряката селекция и после омешан с метода на мехурчето.

 

при първия сортирането би могло да бъде

for(int passes=0;passes<size/2-1; passes++) {    smallest = passes;    for(j=passes+1;j<size/2;j++)       if(myArray[j]<myArray[smallest])          smallest=j;    j = myArray[passes];         myArray[passes]=myArray[smallest];    myArray[smallest]=j; }

а при метода на мехурчето:

int flag, t;do {   flag = 0;   for(int i=0;i<size/2-1;i++) {      if(myArray[i] > myArray[i+1]){          t=myArray[i];          myArray[i]=myArray[i+1];          myArray[i+1]=t;         flag = 1;        }                   }		} while (flag);
Редактирано от ined (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Ined, мисля, че варианта на автора също се води като "Метод на мехурчето", въпреки формата в който е написан. Не съм сигурен дали проблема в е омешването на двата алгоритъма или е по - скоро е copy-paste проблем. 

 

Въпреки това, може би пряката селекция в случая би била малко по - разбираема (по лично мнение) - поне човек по - трудно би се объркал кое е следващо, кое е предишно и изобщо как се случва сортирането. В случая объркването идва донякъде и от това, че при двете наредби на половинките на масива, не извършваме консистентни проверки - в едини случая сравняваме текущото със следващото, в другия - текущото с предходното. Освен това и циклите са странни - едни започват от началото на сортирвания подмасив, други от края - малко трудно се хващат спатийте на програмата и кода. Замислих се дали да давам и решението с пряка селекция, но ми се струва, че е по - добре автора да си го разпише самостоятелно - като упражнение. 

 

Поздрави !

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Всъщност си мисля друго - защо изобщо трябва да се дели на две сортирания като може и с едно?

#include <iostream> using namespace std; int main(){    int size,h, t, flag;    cout << "Size = ";    cin >> size;     h = (size-1)/2;    int *myArray = new int [size];    for(int i=0; i<size;i++)        cin >> myArray[i];         do {        flag = 0;        for(int i=0;i<size-1;i++) {            if (size%2 && i==h-1) i++;            if(myArray[i+(i>h)] > myArray[i+(i<h)]){                  t=myArray[i];                  myArray[i]=myArray[i+1];                  myArray[i+1]=t;                  flag = 1;                             }        }                     } while (flag);        for (int i = 0; i < size; i++){        cout << myArray[i] << " ";    }     cout << endl;            system("PAUSE");    return EXIT_SUCCESS;}

Редактирано от ined (преглед на промените)

  • Харесва ми 2

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

 

Всъщност си мисля друго - защо изобщо трябва да се дели на две сортирания като може и с едно?

Това решение е наистина доста елегантно и най - доброто от тези, които има приложени по темата.

Предполагам и запитващия в един момент би стигнал до него, но не и преди да мине през горните две (поне по мое мнение и наблюдение).

Това разписване би било решение на човек с някакъв по-стабилен опит в програмирането. Не мисля, че е нещо, до което навлизащ в занаята човек би достигнал на Prima vista и би разписал с един замах :)

 

Определено този запис ще помогне на запитващия да научи и още няколко трика, но нека се увери, че първо правилно е коригирал първоначалния си код и след това да продължи с оптимизирането :)

 

Поздрави !

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Да си допиша тука един отложен коментар:Решението горе е хубаво, ако трябва да е с най-кратък код. (незнам колко е оптимално с тоя if във най-вътрешния цикъл)Обаче, правилното и най-практичното решение е, с функция за сортиране с параметри начален и краен елемент и посока и да се извика 2 пъти за двете части на масива.

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Като за начало, бих почнал с това, че се извинявам за заглавието :D !! След това ще кажа, че се смятам за начинаещ в програмирането, сега съм 10 клас. В интерес на истината, когато публикувах темата, седнах и си напънах малко мозъка, стигнах до решението на soundtracker, но отново имах грешка и тя беше, че извеждах масива не накрая, като цяло, а след всяка от двете части, а после видях какво ти си написал като коментари => оправих го и всичко си беше наред. За напред ще мисля повече преди да бързам да публикувам теми така. Ще прегледам и този по-кратък вариант на ined, като цяло благодаря за помощта! Поздрави :)

  • Харесва ми 3

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Регистрирайте се или влезете в профила си за да коментирате

Трябва да имате регистрация за да може да коментирате това

Регистрирайте се

Създайте нова регистрация в нашия форум. Лесно е!

Нова регистрация

Вход

Имате регистрация? Влезте от тук.

Вход

×

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите условия за ползване.