• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dlaczego mi tego nie sortuje?

Object Storage Arubacloud
0 głosów
195 wizyt
pytanie zadane 5 lipca 2018 w C i C++ przez WhiteDragon Początkujący (290 p.)

Kod wygląda ok,zlicza ładnie i po kolei ale na końcu nie chce wyświetlić posortowanych liczb. Poprawcie co tam jest źle,bo nie mam już do tego siły....

Musi być technika sortowania przez zliczanie,bez żadnej funkcji sort i bez funkcji,zwyczajnie w main.

Oto kod:

#include "stdafx.h"
#include <iostream>
#include<algorithm>
#include <Windows.h>
using namespace std;


int main()
{
	const int wt = 8;
	int tab1[wt] = { 0,0,0,0,0,0,0,0 };
	int tab2[11] = { 0,0,0,0,0,0,0,0,0,0,0 };
	int tab3[wt];
	cout << "wpisz elementy tablicy:" << endl;
	for (int i = 0; i < wt; i++)
	{
		cout << i << ":" << " "; cin >> tab1[i];
		cout << endl;
	}
	cout << "tablica przed sortowaniem: ";
	for (int i = 0; i < wt; i++) cout << tab1[i] << " ";
	cout << endl;

	for (int i = 0; i < wt; i++)
	{
		tab2[tab1[i]]=tab2[tab1[i]]+1;
	}

	for (int i = 0; i < 11; i++)
	{
		cout << "Element tablicy numer" << " " << i << " " << "wystepuje" << " " << tab2[i] << " " << "razy." << endl;
	}
	for (int i = 0; i < 11; i++)tab3[i] =tab1[i];
	//sort(tab3, tab3 + 8);
	cout << "Tablica po sortowaniu: ";
	for (int i = 0; i < wt; i++) cout << tab3[i] << " ";
	system("Pause");
    return 0;
}

I nie hejtujcie za używanie system pause,tak lubię i tyle xD

2 odpowiedzi

0 głosów
odpowiedź 5 lipca 2018 przez Bondrusiek Maniak (61,370 p.)
wybrane 6 lipca 2018 przez WhiteDragon
 
Najlepsza
Witam,

możesz sobie podpatrzeć przykład sortowania przez zliczanie i odpowiednio go zedytować do swoich potrzeb.

http://www.algorytm.org/algorytmy-sortowania/sortowanie-przez-zliczanie-countingsort/count-1-c.html
komentarz 5 lipca 2018 przez WhiteDragon Początkujący (290 p.)

Dzięki wielkie za przykład,niestety po przerobieniu tego na "moje" wszystko gra poza tablicą wynikową,nawet nie wiem o co chodzi w tym błędzie. Może znajdziesz co jest nie tak. Zaznaczone jest prawdopodobne miejsce problemu.

Zlicza fajnie,ale w wynikach sortowania daje kosmiczne liczby...

#include "stdafx.h"
#include <iostream>
#include <algorithm>
#include <Windows.h>
using namespace std;


int main()
{
	int i;
	const int wt = 8;
	int tab1[wt] = { 0,0,0,0,0,0,0,0 };
	int tab2[11] = { 0,0,0,0,0,0,0,0,0,0,0 };
	int tab3[wt];
	cout << "wpisz elementy tablicy:" << endl;
	for (int i = 0; i < wt; i++)
	{
		cout << i+1 << ":" << " "; cin >> tab1[i];
		cout << endl;
	}
	cout << "tablica przed sortowaniem: " << " ";
	for (int i = 0; i < wt; i++) cout << tab1[i] << " ";
	cout << endl;
	///PRZEROBIONY KOD Z FORUM
	for (i = 0; i < 8; i++)
	{
		tab2[tab1[i]] + 1;
	}
	for (i = 1; i <= 10; i++)
	{
		tab2[i] += tab2[i - 1];
	}
	for (i = 7; i >= 0; i--)
	{
		tab3[(tab2[(tab1[i])]) - 1] = tab1[i];//tutaj cos nie gra
		tab2[(tab1[i])] - 1;
	}

    ///****************************
	cout << "Tablica po sortowaniu: " << " ";
	for (int i = 0; i < wt; i++)
	{
		cout << tab3[i] << " ";
	}
	delete[]tab2;
	delete[]tab1;
	delete[]tab3;
	system("Pause");
	return 0;
}

 

komentarz 6 lipca 2018 przez Bondrusiek Maniak (61,370 p.)

Witam,

najłatwiej będzie jak w funkcji main podstawisz funkcje z tego przykład. Tylko musisz odpowiednio podstawić zmienne żeby pasowały do przykłady z podlinkowanej strony. Tutaj musisz uważać gdyż ten zapis jest dosyć skomplikowany. Dodatkowo popełniasz błąd gdyż używasz delete[] na tablicy która nie jest zaalokowana. Operator delete powinno się stosować do wskaźników stworzonych przez operator new .

#include <iostream>
#include<algorithm>
#include <Windows.h>
using namespace std;


int main()
{
    int a;
    const int wt = 8;
    int *A = new int[wt];
    int *B = new int[wt];

    cout << "wpisz elementy tablicy:" << endl;
    for (int a = 0; a < wt; a++)
    {
        cout << a+1 << ":" << " "; cin >> A[a];
        cout << endl;
    }
    cout << "tablica przed sortowaniem: " << " ";
    for (int a = 0; a < wt; a++) cout << A[a] << " ";
    cout << endl;
//int max_liczba(int tablica[], int rozmiar)
    int k = A[0];
    for( int a = 1 ; a < wt; a++)
    {
        if( k < A[a])
        {
            k = A[a];
        }
    }

//countingsort(tablica_wejsciowa,tablica_wyjsciowa, k, ilosc_liczb);
    int i;
    int *C = new int [k+1]; // utworzenie tablicy na statystyki; wszystkie liczby w tablicy sa nie wieksze od k, a C[i] okresla ile razy wystapila liczb i
    for (i = 0; i <= k; i++) // zerowanie tablicy pomocniczej
    C[i] = 0;
    for (i = 0; i < wt; i++)
    C[(A[i])]++;
    // C[i] zawiera teraz liczbe wystapien liczby i w ciagu wejsciowym
    for (i = 1; i <= k; i++)
    C[i] += C[i-1];
    // C[i] zawiera teraz liczbe elementow mniejszych lub rownych i
    for (i = wt-1; i >= 0; i--)
    {
    B[(C[(A[i])])-1] = A[i]; // wpisanie do tablicy wynikowej pod określony indeks A[i]
    C[(A[i])]--; // zmniejszenie indeksu C[i] - odejmujemy wpisana przed chwila liczbe
    }
    delete [] C;
//po sortowaniu
    cout << "Po sortowaniu " << endl;
    for(int x = 0; x < wt; ++x)
    {
        cout << "tab3[" << x << "] = " << B[x] << endl;
    }

    delete [] A;
    delete [] B;
    system("Pause");
    return 0;
}

komentarz 6 lipca 2018 przez WhiteDragon Początkujący (290 p.)
Rozumiem ale teraz program tylko sortuje ale nie wyświetla tablicy zliczeń,czyli nie wypisuje ile wystąpiły liczby od 0 do 10 w tej tablicy,a to miało być pokazane jeszcze przed sortowaniem....
komentarz 6 lipca 2018 przez WhiteDragon Początkujący (290 p.)
W sensie,że o występuje dajmy na to 0 razy,1 występuje 2 razy itd aż do 10. Bo ma zliczać nawet liczby,których nie ma i pokazywać te zera ale nie do końca wiem jak to w tym kodzie dodać
0 głosów
odpowiedź 6 lipca 2018 przez WhiteDragon Początkujący (290 p.)

Oki,udało mi sie rozwiązać problem.

Kod wygląda tak:

#include "stdafx.h"
#include <iostream>
#include<algorithm>
#include <Windows.h>
using namespace std;


int main()
{
	int n;
	const int wt = 8;
	int *tab1 = new int[wt];
	int *tab2 = new int[wt];
	int tabZ[11] = { 0,0,0,0,0,0,0,0,0,0,0 };
	
		
	cout << "wpisz elementy tablicy:" << endl;
	for (int n = 0; n < wt; n++)
	{
		cout << n + 1 << ":" << " "; cin >> tab1[n];
		cout << endl;
	}
	cout << "tablica przed sortowaniem: " << " ";
	for (int n = 0; n < wt; n++) cout << tab1[n] << " ";
	cout << endl;
	//tablica zliczeń
	for (int i = 0; i < wt; i++)
	{
		tabZ[tab1[i]] = tabZ[tab1[i]] + 1;
	}
	for (int i = 0; i < 11; i++)
	{
		cout << "Element tablicy numer "<<" " << i << " "<<" wystepuje" <<" "<< tabZ[i] <<" "<<"razy" << endl;
	}


	int k = tab1[0];
	for (int n = 1; n < wt; n++)
	{
		if (k < tab1[n])
		{
			k = tab1[n];
		}
	}

	int i;
	int *tab3 = new int[k + 1]; // utworzenie tablicy na statystyki; wszystkie liczby w tablicy sa nie wieksze od k, a C[i] okresla ile razy wystapila liczb i
	for (i = 0; i <= k; i++) // zerowanie tablicy pomocniczej
		tab3[i] = 0;
	for (i = 0; i < wt; i++)
		tab3[(tab1[i])]++;
	// C[i] zawiera teraz liczbe wystapien liczby i w ciagu wejsciowym
	for (i = 1; i <= k; i++)
		tab3[i] += tab3[i - 1];
	// C[i] zawiera teraz liczbe elementow mniejszych lub rownych i
	for (i = wt - 1; i >= 0; i--)
	{
		tab2[(tab3[(tab1[i])]) - 1] = tab1[i]; // wpisanie do tablicy wynikowej pod określony indeks A[i]
		tab3[(tab1[i])]--; // zmniejszenie indeksu C[i] - odejmujemy wpisana przed chwila liczbe
	}
    delete[] tab3;

	//po sortowaniu
	cout << "Po sortowaniu " << endl;
	for (int x = 0; x < wt; ++x)
	{
		cout << "tab3[" << x << "] = " << tab2[x] << endl;
	}

	delete[] tab1;
	delete[] tab2;
	system("Pause");
	return 0;
}

 

Podobne pytania

0 głosów
0 odpowiedzi 94 wizyt
pytanie zadane 19 kwietnia 2020 w C i C++ przez chrystian Gaduła (4,780 p.)
0 głosów
1 odpowiedź 126 wizyt
pytanie zadane 16 lipca 2018 w C i C++ przez XaFF Użytkownik (610 p.)
0 głosów
1 odpowiedź 203 wizyt

92,576 zapytań

141,426 odpowiedzi

319,650 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...