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

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


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

Единия алгоритъм за сортиране трябва да бъде метод на мехурчето (за реализация ползвайте описанието в Wikipedia), а другия сортиране чрез метода на пряката селекция(отново ползвайте Wikipedia). 
 

Това ми е задачата, но имам затруднение не знам как да започна гледам нещата от wikipedia и не мога да разбера как да я направя.

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


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

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

  • Харесва ми 1

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


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

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

#include<iostream>
#include<conio.h>
using namespace std;
main()
{
int hold, number;
int array[number];
cout<<"Enter numbers: "<<endl;
cin >> number;
 
for(int i=0; i<number; i++)
{
cin>>array;
}
cout<<endl;
 
for(int j=0; j<number; j++)
{
//cout<<array[j];
cout<<endl;
}
cout<<endl;
for(int i=0; i<number; i++)
{
for(int j=0; j<number; j++)
{
if(array[j]>array[j+1])
{
hold=array[j];
array[j]=array[j+1];
array[j+1]=hold;
}
}
}
cout<<"Sorted Array is: "<<endl;
for(int i=0; i<number; i++)
{
cout<<array<<endl;
}
getch();
}
Написах това, но си нямам идея дали е правилно.
 
задачата трябва на изхода да изглежда така 

 
 
1 4 2 5 8
1 2 4 5 8
1 2 4 5 8
 
1 5 4 2 8
1 2 4 5 8
1 2 4 5 8
1 2 4 5 8
 
Редактирано от Цветан Стоянов (преглед на промените)

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


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

Ами не;

int hold, number;
int array[number];
Заделяне на памет със стойността на още неинициализирана променлива
for(int j=0; j<number; j++)
{
if(array[j]>array[j+1])
Излизане извън границите на масива 
 
  • Харесва ми 1

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


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

Пряка селекция:

#include<iostream>
using namespace std;

int main()
{
    int n;
    cout<<"Duljina:\n";
    cin>>n;
    int A[10000];
    cout<<"Elementi:\n";
    for(int i=0;i<n;i++)cin>>A;
    for(int i=0;i<n-1;i++)
    {
        int max=i;
        for(int j=i+1;j<n;j++)
        {
            if(A[j]<A[max])max=j;
        }
        int temp = A;
        A = A[max];
        A[max] = temp;
    }
    cout<<"Otgovor:\n";
    for(int i=0;i<n;i++)cout<<A<<" ";
    return 0;
}

 

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

#include<iostream>
using namespace std;

int main()
{
    int n;
    cout<<"Duljina:\n";
    cin>>n;
    int A[10000];
    cout<<"Elementi:\n";
    for(int i=0; i<n; i++)cin>>A;
    for(int i=0; i<n-1; i++)
    {
        for(int j=0; j<n-1; j++)
        {
            if(A[j]>A[j+1])
            {
                int temp = A[j];
                A[j] = A[j+1];
                A[j+1] = temp;
            }
        }
    }
    cout<<"Otgovor:\n";
    for(int i=0; i<n; i++)cout<<A<<" ";
    return 0;
}

Редактирано от kokomil
2.6 Не се толерира практиката на flood – публикуване на едно и също нещо многократно, както и публикуването на голям брой мнения от един потребител едно след друго. За добавяне на информация към предишен пост има бутон "Редактирай" на всеки ваш (преглед на промените)

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


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

Колега защо заделяте толкова много елементи?

    cin>>n;
    int *A = new int[n];
    cout<<"Elementi:\n";
    for(int i=0;i<n;i++)cin>>A[i];

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


Линк към този отговор
Сподели в други сайтове
публикувано (редактирано)
flag = true;
while (flag != false)
{
    flag = false;
    for (i = 0; i < n-1; i++)
    {
        if (a[i + 1] < a[i])
        {
            temp = a[i];
            a[i] = a[i+1];
            a[i+1] = temp;
            flag = true;   // повдигаме флага, който се проверява от външния цикъл за край
        }
    }
    n--; // ръчно намаляме диапазона на нарастване на индекса, защото последния елемент си е на мястото 
} 

И метода на мехурчето не е написан както трябва. 

 

Не е добре да е цикъл в цикъл без проверки за край, защото елементите могат да са подредени много по рано. По добре е да има флаг, който да се нулира преди всяко изпълнение на вътрешния цикъл и да се повдига, ако има фактическа смяна на елементи по време на цикъла. Ако в края флага не е повдигнат, следователно масива е сортиран. Освен това, по добре е външния цикъл да не се организира с for, а с while и ръчно променяне на диапазона на индекса на вътрешния цикъл, тъй като при всяка следваща итерация, подредените елементи на края на масива са най малкото равни на броя на итерациите. Следователно по добре е на всяка итерация диапазона на нарастване на индекса на вътрешния цикъл да се намалява с единица.

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

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


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

Колега защо заделяте толкова много елементи?

    cin>>n;
    int *A = new int[n];
    cout<<"Elementi:\n";
    for(int i=0;i<n;i++)cin>>A[i];
Не е хубаво да се заделя памет за масив чрез дадена променлива като брой на елементите. Някои компилатори на Линукс дават грешки. Съжалявам, ако греша.

Относно флага: мислех, че по начина по, който го написах ще му е по-лесно да го осмисли.

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


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

Дават грешка на заделяне от рода на  int A[n];  където n e променлива,

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


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

Извинете, допуснал съм грешка. Ще гледам да не се повтаря.

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


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

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

 

 

Има два вида памет. Едната се заделя от компилатора въз основа на декларациите, а другата се заделя от самата програма, по време на изпълнението и.

 

В декларациите предназначени за компилатора, количеството на паметта, която ще се заделя, трябва да може да се изчисли точно, по време на компилиране. Иначе компилатора не може да се справи и дава съобщение за грешка. За това и, когато декларираш памет, която трябва да се задели от компилатора, по време на компилиране, не можеш да я декларираш, чрез променливи, които ще бъдат изчислени по време на изпълнение на програмата.

 

Естествено има синтактична разлика между заделянето на едната памет и заделянето на другата. Декларирането на памет, която ще се заделя динамично по време на изпълнението на самата програма, на езика С++ става с оператора "new", а на езика С става с функцията "malloc()" 

  • Харесва ми 1

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


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

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

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

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

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

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

Вход

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

Вход

×

Информация

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