Sortowanie przez kopcowanie

0
#include<iostream>
#include <algorithm>
#include<ctime>
using namespace std;

void buble(int *tab,int n) //sorotwanie babelkowe funkcja dostaje tablice przez wskaznik i jej rozmiar
{
	int tmp; // zmienna pomocniczka do zamiany kolejnosci
	for(int i=0; i<n-1; i++) //petla leci po wszystich liczbach z tablicy i sprwdza je parami
	{
		for(int j=0; j<n-1-i; j++)
		{
			if( tab[j] > tab[j+1])
			{
				tmp = tab[j];
				tab[j] = tab[j+1]; // 4 2
				tab[j+1] = tmp;

			}
		}
	}
}
void insert(int *tab, int n)
{
	int tmp;
	for(int i = 1,j ; i<n; i++)
	{
		tmp = tab[i];
		for( j = i - 1; j >=0 && tmp <tab[j]; --j)
			tab[j+1] = tab[j];
		tab[j + 1] = tmp;
	}
}
void heapify(int *T,int n, int i)
{
	int l,r;
	l = 2*i;
	r = 2*i+1;
	int largest = i;
	if( (l<n) && (T[l] > T[i]) )
		largest = l;
	if( (r<n) && (T[r] > T[largest]) )
		largest = r;

	if(largest != i)
	{
		swap(T[i], T[largest]);
		heapify(T,n,largest);
	}
}
void BuildHeap(int *T, int n)
{
	for( int i=n/2; i>=0; --i)
		heapify(T, n, i);
}
void HeapSort(int *T, int n)
{
	BuildHeap(T, n);
		for(int i=n-1; i>0; --i)
		{
			swap(T[0], T[i]); //element przenisimy na koniec
			heapify(T, --n, 1); //przywracamy wlasnosc dla kopca mniejszego
		}
}
int main()
{
	const int S = 10;
	int tab[S];
	srand(static_cast<unsigned int>(time(NULL)));
	for(int i=0; i<S; i++)
		tab[i] = rand()%10;

	cout << "tablica nieposotowana: " << endl;
	for(int i=0; i<S; i++)
		cout << tab[i] << "   ";
	cout << endl;
	int i=0;
	HeapSort(tab, S);

	cout << "tablica posortowana: " << endl;
	for(int i=0; i<S; i++)
		cout << tab[i] << "   ";
	return 0;
}

Nie sortuje poprawnie ale nie moge znaleŹĆ błędnu..

0

Przepisywałeś pewnie z Pascala/jakiegoś pseudokodu używającego 1 jako pierwszego elementu tablicy?
Błąd jest tutaj:

void HeapSort(int *T, int n)
{
        BuildHeap(T, n);
                for(int i=n-1; i>0; --i)
                {
                        swap(T[0], T[i]);
                        heapify(T, --n, 0); // ZERO, nie jeden
                }
}
0

Pisalem na podstawie pseudokodu faktycznie.. Ale nie działa i tak po poprawieniu

0

Jak to się mówi, 'u mnie działa'.

D:\>a
tablica nieposotowana:
1   7   8   6   6   4   3   5   3   3
tablica posortowana:
1   3   3   3   4   5   6   6   7   8
D:\>a
tablica nieposotowana:
1   7   8   6   6   4   3   5   3   3
tablica posortowana:
1   3   3   3   4   5   6   6   7   8
D:\>a
tablica nieposotowana:
4   7   2   1   1   0   5   8   6   5
tablica posortowana:
0   1   1   2   4   5   5   6   7   8
D:\>a
tablica nieposotowana:
7   6   9   5   5   7   8   1   8   7
tablica posortowana:
1   5   5   6   7   7   7   8   8   9
D:\>a
tablica nieposotowana:
7   6   9   5   5   7   8   1   8   7
tablica posortowana:
1   5   5   6   7   7   7   8   8   9

Wygląda OK.

Pełny kod kompilowany przeze mnie:

#include<iostream>
#include <algorithm>
#include<ctime>
using namespace std;
 
void buble(int *tab,int n) //sorotwanie babelkowe funkcja dostaje tablice przez wskaznik i jej rozmiar
{
        int tmp; // zmienna pomocniczka do zamiany kolejnosci
        for(int i=0; i<n-1; i++) //petla leci po wszystich liczbach z tablicy i sprwdza je parami
        {
                for(int j=0; j<n-1-i; j++)
                {
                        if( tab[j] > tab[j+1])
                        {
                                tmp = tab[j];
                                tab[j] = tab[j+1]; // 4 2
                                tab[j+1] = tmp;
 
                        }
                }
        }
}
void insert(int *tab, int n)
{
        int tmp;
        for(int i = 1,j ; i<n; i++)
        {
                tmp = tab[i];
                for( j = i - 1; j >=0 && tmp <tab[j]; --j)
                        tab[j+1] = tab[j];
                tab[j + 1] = tmp;
        }
}
void heapify(int *T,int n, int i)
{
        int l,r;
        l = 2*i;
        r = 2*i+1;
        int largest = i;
        if( (l<n) && (T[l] > T[i]) )
                largest = l;
        if( (r<n) && (T[r] > T[largest]) )
                largest = r;
 
        if(largest != i)
        {
                swap(T[i], T[largest]);
                heapify(T,n,largest);
        }
}
void BuildHeap(int *T, int n)
{
        for( int i=n/2; i>=0; --i)
                heapify(T, n, i);
}
void HeapSort(int *T, int n)
{
        BuildHeap(T, n);
                for(int i=n-1; i>0; --i)
                {
                        swap(T[0], T[i]); //element przenisimy na koniec
                        heapify(T, --n, 0); //przywracamy wlasnosc dla kopca mniejszego
                }
}
int main()
{
        const int S = 10;
        int tab[S];
        srand(static_cast<unsigned int>(time(NULL)));
        for(int i=0; i<S; i++)
                tab[i] = rand()%10;
 
        cout << "tablica nieposotowana: " << endl;
        for(int i=0; i<S; i++)
                cout << tab[i] << "   ";
        cout << endl;
        int i=0;
        HeapSort(tab, S);
 
        cout << "tablica posortowana: " << endl;
        for(int i=0; i<S; i++)
                cout << tab[i] << "   ";
        return 0;
}

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