Sortowanie tablicy o podanych elementach

0

Mam program, który posortuje liczby w tablicy, z tym, że te liczby będą od razu podane w programie.
Program się kompiluje, ale po pojawieniu konsoli wyskakuje błąd, że program przestał działać.
Nie wiem co jest powodem, dlatego próbuję czego się da i wciąż jest to samo (w komentarzach zapisana poprzednia wersja zadania, też skompilowało ale wyrzuciło potem błąd). Rozwiązanie z wskaźnikiem i delete wzorowane na przykładach z internetu, które miały ten problem rozwiązać ale u mnie dalej nie chce zadziałać.

 #include <iostream>
using namespace std;

void sortowanie(int *tab, int size){

     int ktoraPozycja = 0;
     int bufor;

     while(ktoraPozycja<size){
     for(int i=size-1; i>=1; i++){
            if(tab[i] < tab[i-1])
            bufor = tab[i-1];
            tab[i-1]=tab[i];
            tab[i]=bufor;
            ktoraPozycja=i;
            }
    }

}

int main(){
    int *arr;
    arr = new int[5];
    arr[0]=2;
    arr[1]=7;
    arr[2]=1;
    arr[3]=5;
    arr[4]=3;

    int size=5;
    /*
    int arr[]= {2, 7, 1, 5, 3};
    int size = sizeof(arr) / sizeof(int);
    */

    sortowanie(arr, size);

        cout << "Po posortowaniu arr[]= {";
        for(int i=0; i<size; i++){
            cout <<arr[i]<<", ";
        }
        cout <<"]"<<endl;

    delete []arr;
    return 0;
}

Mógłby ktoś wyjaśnić dlaczego się to wysypuje? I jak to zmienić?
Być może to zwykłe przeoczenie i problem jest błahy, ale dopiero zaczynam naukę języka C++.

1

Używanie new i delete w nowoczesnym kodzie C++ to antyidiom.

Użyj std::vector. Do sortowania możesz użyć std::sort, chyba, że masz je napisać sam. Wtedy polecam std::swap.

Problemy w Twoim kodzie:

  1. Formatowanie.
for (int i = size - 1; i >= 1; i++) {

Idziesz w górę, zamiast w dół (i--)
3.

 if(tab[i] < tab[i-1])
    bufor = tab[i-1];
tab[i-1]=tab[i];
tab[i]=bufor;

Indentacja utrudniająca czytanie kodu. Dopiero jak przepuściłem przez formater to zauważyłem, że if ma tylko jedną instrukcję.
4. Idąc w dół ktoraPozycja nigdy nie osiągnie size. Cały ten algorytm dla mnie niezbyt ma sens. W sortowaniu bąbelkowym wykonujesz porównania tak długo jak w trakcie jednego przebiegu została zrobiona choć jedna zmiana.

0

Bardzo dziękuję, teraz widzę, while zmienione na if i już wszystko działa (i zmiana i++ na i--, mój głupi błąd, przyznaję)
Bardzo dziękuję jeszcze raz! :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1