Triedenie pomocou quicksortu – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Triedenie pomocou quicksortu – C / C++ – Fórum – Programujte.comTriedenie pomocou quicksortu – C / C++ – Fórum – Programujte.com

 

gaben0
Stálý člen
22. 11. 2009   #1
-
0
-

Zdravim! Píšem program, ktorý triedi zadané pole pomocou quicksortu, no nefunguje tak ako má a neviem prečo. Vie mi s tým niekto poradiť?



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

void quickSort(int *pole, int zaciatocnyPrvok, int konecnyPrvok);
void swap(int *x, int *y);

int main()
{
int pocetPrvkov, i, zaciatocnyPrvok, konecnyPrvok;
int *pole; //Naše pole, ktoré budeme triediť

printf("Zadajte pocet prvkov pola: ");
scanf(" %d", &pocetPrvkov);

pole = (int *) malloc(pocetPrvkov * sizeof(int)); //Alokujeme potrebnú pamäť

for (i = 0; i < pocetPrvkov; i++)
{
printf("Hodnota prvku %d: ", i);
scanf(" %d", &pole[i]);
}

printf("Zaciatocny prvok triedenia: ");
scanf(" %d", &zaciatocnyPrvok);
printf("\nKonecny prvok triedenia: ");
scanf(" %d", &konecnyPrvok);

//Time for quicksort :)

//konecnyPrvok = pocetPrvkov - 1;
quickSort(pole, zaciatocnyPrvok, konecnyPrvok);


//Po utriedení vypíšem prvky...
printf("\n\nTriedim od %d po %d...\n", zaciatocnyPrvok, konecnyPrvok);

for (i = 0; i < pocetPrvkov; i++)
printf("Hodnota prvku %d: %d.\n", i, pole[i]);



getchar();
getchar();
return 0;
}

void swap(int *x, int *y)
{
int pomocna;
pomocna = *x;
*x = *y;
*y = pomocna;
}

void quickSort(int *pole, int zaciatocnyPrvok, int konecnyPrvok)
{
int pivot, mensie, i, l, r;

pivot = pole[konecnyPrvok - 1];
mensie = 0;
for (i = zaciatocnyPrvok; i < konecnyPrvok - 1; i++)
{
if (pole[i] < pivot)
mensie++;
}
swap (&pole[konecnyPrvok - 1], &pole[zaciatocnyPrvok + mensie]);
l = zaciatocnyPrvok;
r = konecnyPrvok - 1;

while (l < r)
{
while (pole[l] < pivot)
l++;
while(pole[r] >= pivot)
r--;
if (l < r)
swap(&pole[l], &pole[r]);
}
if (r > zaciatocnyPrvok)
quickSort(pole, l, r);
if (l + 2 < konecnyPrvok)
quickSort(pole, l + 1, konecnyPrvok);
}

Nahlásit jako SPAM
IP: 85.237.18.–
C, C++
reciproke
~ Anonymní uživatel
98 příspěvků
22. 11. 2009   #2
-
0
-

To gaben : nejsem si jistý celé jsem to neprocházel, ale ty ukazatelé l a r nesmí ukazovat na stejný prvek pro skončení dělení pole.

Nahlásit jako SPAM
IP: 213.194.242.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 82 hostů

Podobná vlákna

Triedenie — založil Thomash

Triedenie MergeSort — založil newo

Triedenie udajov v C — založil presto

Pascal triedenie MAXSORT — založil pietro62

Triedenie textoveho suboru — založil Wulp

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý