Sortowanie babelkowe C

0

Witam mam problem z sortowaniem bąbelkowym tzn. mam zadanie w którym muszę wygenerować tablice od 100000 do 1000000 losowych elementow z krokiem co 100000.Program dziala polowicznie do tablicy 500000 elementowej działa powyżej sie zawiesza.Prosze o pomoc

#include<stdio.h> 
#include<stdlib.h> 
#include<time.h> 

void sortowanie_b(int tab[],int n)
{


    int i,j,x;
    for (i=0;i<n-1;i++)
    for (j=0;j<n-1;j++)
    if (tab[j]<tab[j+1])
    {
    x=tab[j];
    tab[j]=tab[j+1];
    tab[j+1]=x;
    }
}

main(){

int z=10000;

int tab[z], i,j,length;
  int value;
  
srand(time(NULL));
for(i=0; i<z; i++)
    {
        tab[i] = rand();
        printf("%d\n",tab[i]);
    }
  clock_t start, finish;
double duration;
start = clock();  
sortowanie_b(tab,z);
finish = clock();
duration = (double)(finish - start) / CLOCKS_PER_SEC;
for(i=0;i<z;i++)
printf("posortowane:%d\n",tab[i]);	
	
 printf( "\nCzas wykonywania programu %2.5f seconds\n", duration ) ; } 
0

Poczekaj kilkanaście/kilkadziesiąt minut to w końcu się posortuje.

To przecież bubblesort.

0

Tylko w tym problem ze pokazuje się okno ze program przestał odpowiadać i można tylko go zamknąć, wiec sadze ze gdzieś jest błąd w kodzie.Dlatego proszę o pomoc.

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

pomyśl jak to zoptymalizować. Co prawda nie zabijesz tym kwadratowej złożoności, ale będzie nieco lepiej. Właściwie mnostwo rzeczy mozna tu zoptymalizować.
Moje bąble (wierze, ze szybciej sie nie da) działają u mnie dla 70000-elementowej tablicy 0m8.310s. Natomiast Twoje 0m15.851s. Da sie? Da sie. Próbuj.

0

Tu chodzi o to ze nie moge wygenerowac tablicy powyzej 500000 jest jakies ograniczenie?? Moze ktos odpalic ten program u siebie i ustawi tablice 1000000. Bo mi program sie wylacza powyzej 500000

 #include <stdio.h>
#include <stdlib.h>
#include <time.h>






int main()
{

int i,tab[600000];
clock_t start, stop;
srand(time(NULL));
for(i=0;i<600000;i++) tab[i]=rand();
printf("Przed sortowaniem. \n");
for(i=0;i<600000; i++) printf("%d\n", tab[i]);
start=clock();

stop=clock();
}
0

Strzelam, że sławne Stack Overflow - stos jest mocno ograniczonym miejscem pamięci i nie wszystko sie tam zmiesci. Rób to na stercie, alokując tablice dynamicznie.

0

Dzieki za podpowiedz:) Teraz juz działa. Jeszcze jedno pytanie czy taki program mozna odpalic na wiecej niz jednym rdzeniu procesora? A jezli tak to jak to zrobic

1

Jeżeli używany przez Ciebie kompilator obsługuje C11, to należy dołączyć nagłówek <threads.h>, opisane w dokumentacji: http://en.cppreference.com/w/c/thread
W przeciwnym wypadku potrzebna jest kompatybilna biblioteka zewnętrzna, np. PThreads, ZThreads, WinAPI Thread.

Niezależnie od tego należy zapoznać się z zagadnieniami dotyczącymi wielowątkowości, takimi, szczególnie uruchamianie i synchronizacja wątków.

Program będzie używać co najwyżej tyle rdzeni naraz, ile będzie jednocześnie pracujących wątków. Teraz pomyśl, co można wykonywać równolegle niezależnie od pozostałych wątków. Na przykład, tworzysz 4 wątki, w każdym sortujesz część tablicy (tablica jest jedna, ale każdy wątek operuje na innym zakresie), potem masz tablicę, która składa się z 4 posortowanych tablic, którą trzeba zamienić na jedną posortowaną już w jednym wątku i ta zamiana powinna trwać krócej niż sortowanie całej tablicy w jednym wątku.

0

Powinna? Scalanie bedzie liniowe.
BTW, u mnie dla tablicy wielkosci 1000000 Twoj algorytm dzialal 57m20.686s. Więc nie bądź niecierpliwy.

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