[C#] Sortowanie bąbelkowe

Oto mój kod sortowania bąbelkowego. Czy mógłby mi ktoś powiedzieć z czego wynika błąd ? Spotykam się z nim coraz częściej. Może błąd jest w moim rozumowaniu. Głównie chodzi mi o wypisywanie tej tablicy, bo reszta jest chyba ok.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;


namespace ConsoleApplication6

{

    class Program

    {

        static void Main(string[] args)

        {


            int n,i;

            n = 10;


    int[] tablica = new int[n] ;

    tablica[0] = 1305 ;

    tablica[1] = 12 ;

    tablica[2] = -3 ;

    tablica[3] = 788 ;

    tablica[4] = 2 ;

    tablica[5] = 788 ;

    tablica[6] = -10 ;  

    tablica[7] = 0 ;

    tablica[8] = 9 ;

    tablica[9] = -55 ;


    for (i = 0; i < n; i++) ;

    Console.WriteLine(tablica[i]);

    n = 10;


            do

        for (i = 0; i < n - 1; i++)

            if (tablica[i] > tablica[i + 1])

                tablica[i] = tablica[i + 1];


    while (n > 1);


        }

    }

}

Jaki błąd?

do

        for (i = 0; i < n - 1; i++)

            if (tablica[i] > tablica[i + 1])

                tablica[i] = tablica[i + 1];


    while (n > 1);

co to jest?

  1. nawet jeśli nie trzeba używać nawiasów klamrowych to w dobrym tonie jest ich używanie.

  2. serio co to jest? spójrz ten kawałek kodu i zastanów się co chciałeś napisać bo w tym momencie masz nieskończonę pętlę (n nigdzie się nie zmienia więc nie osiągnie wartości mniejszej równej 1, jeśli warunek z if’a jest prawdziwy nadpisujesz wartość w komórce tablicy i tracisz ją

Ja jestem osobiście zwolennikiem klamerek. Stosuj je, później jak zobaczysz cudzy kod bez klamerek to się za głowę złapiesz o co tam chodzi :wink: Nawet jak if czy for mają jedną linijkę pod sobą jest to znacznie bardziej czytelne. Po drugie. Nadpisujesz wartości a nie zamieniasz. Po trzecie nie zmniejszasz wartości n o jeden po każdym obrocie pętli do{}while

n=tablica.Length.

for(int i=0;i
{

	for(int j=0;j
	{

		if(tablica[j] > tablica[j+1]

		{

			int tmp = tablica[j];

			tablica[j]=tablica[j+1];

			tablica[j]=tmp;

		}

	}

}

Heh, napisałem dokładnie to samo co wyżej :wink:

@Marcin5111 w jakim celu jest j ? skoro to tablica jednowymiarowa a porównywane mają być tylko elementy obok siebie ?

Niestety albo nie mogę pojąć waszych rad, albo totalnie mi się w głowie wszystko miesza, bo program jak nie działał tak się nie rusza

A to takie przyzwyczajenie z pętli for. W pierwszej pętli masz i, i to jest tylko licznik pętli zewnętrznej, Ty użyłeś n ale zapomniałeś o zmniejszaniu tego n. J to jest coś w stylu I u Ciebie.

Po Twojemu to powinno wyglądać tak

do

{

        for (i = 0; i < n - 1; i++)

        {

                if (tablica[i] > tablica[i + 1])

                {

                        int tmp = tablica[i];

                        tablica[i] = tablica[i + 1];

                        tablica[i+1]=tmp;

                }

        }

        n--;

}

while (n > 1);

To pytanie, czemu teraz nie sortuje ?

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;


namespace ConsoleApplication6

{

    class Program

    {

        static void Main(string[] args)

        {


            int n, i;

            n = 10;


            int[] tablica = new int[n];

            tablica[0] = 1305;

            tablica[1] = 12;

            tablica[2] = -3;

            tablica[3] = 788;

            tablica[4] = 2;

            tablica[5] = 788;

            tablica[6] = -10;

            tablica[7] = 0;

            tablica[8] = 9;

            tablica[9] = -55;


            for (i = 0; i < n; i++) 

            Console.WriteLine(tablica[i]);


do

{

        for (i = 0; i < n - 1; i++)

        {

                if (tablica[i] > tablica[i + 1])

                {

                        int tmp = tablica[i];

                        tablica[i] = tablica[i + 1];

                        tablica[i+1]=tmp;

                }

        n--;

}




} while (n > 1);


n = 10;

Console.WriteLine("Po sortowaniu");

for (i = 0; i < n; i++)


Console.WriteLine(tablica[i]);


Console.ReadKey();

        }



    }



}

decrementacja zmiennej n powinna być wewnątrz pętli do while, i na zewnątrz pętli for (teraz masz w obu tych pętlach).

Racja, ja zgubiłem klamerkę, a Ty dodałeś tą klamerkę w innym miejscu.