Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

Задача със сортиране

Featured Replies

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

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

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

  • Автор

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

#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])
Излизане извън границите на масива 
 
  • 3 седмици по-късно...

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

#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];
Не е хубаво да се заделя памет за масив чрез дадена променлива като брой на елементите. Някои компилатори на Линукс дават грешки. Съжалявам, ако греша.

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

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

 

 

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

 

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

 

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

Архивирана тема

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

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    26%
    Дарени 256.00 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.