Algorytmy sortowania - Pomoc

0

Cześć,

Mam takie zadanie i nie mogę sobie z nim poradzić:

Korzystając ze standardowego wzoru projektu C++ napisz program sortujący wylosowany zestaw cyfr z zakresu 1-99 metodą sortowania przez wybieranie. Program powinien zapytać o to ile elementów ma wylosować oraz wyświetlić je na ekranie. Program powinien również wyświetlać wszystkie kroki pośrednie działania algorytmu jak poniżej:

Input 43 41 41 1 56 97 55 41

41 43| 41 1 56 97 55 41
41 41 43| 1 56 97 55 41
41 41 1 43| 56 97 55 41
41 41 1 43 56| 97 55 41
41 41 1 43 56 97| 55 41
41 41 1 43 56 55 97| 41
41 41 1 43 56 55 41 97|

Result 41 41 1 43 56 55 41 97

Mam coś takiego, ale to nie do końca działa tak jak powinno.
Nie wypisuje kroków obliczeń.

#include <cmath>
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <time.h>
#include <vector>

using namespace std;

const int N = 20; // Liczebność zbioru.

// Program główny
//---------------

int main()
{
	int d[N], i, j, pmin, ilosc;

	cout << "Podaj ilosc:";
	cin >> ilosc; 
	
	// Najpierw wypełniamy tablicę d[] liczbami pseudolosowymi
	// a następnie wyświetlamy jej zawartość

	cout << "ZBIOR: \n\n";

	srand((unsigned)time(NULL));

	for (i = 0; i < ilosc; i++) d[i] = rand() % 100;
	for (i = 0; i < ilosc; i++) cout << setw(4) << d[i];
	cout << endl;

	// Sortujemy

	for (j = 0; j < ilosc - 1; j++)
	{
		pmin = j;
		for (i = j + 1; i < ilosc; i++)
			if (d[i] < d[pmin]) pmin = i;
		swap(d[pmin], d[j]);
	}

	// Wyświetlamy wynik sortowania

	cout << "\nPo sortowaniu:\n\n";
	for (i = 0; i < ilosc; i++) cout << setw(4) << d[i];
	cout << endl;
	return 0;
}
0

Nie analizowałem Twojego kodu, ale to jest poprawny selection sort:

void printArray(int arr [], int sz){
	for (int i = 0; i < sz; ++i)
		cout << arr[i] << " ";
	cout <<"\n";
}
void selectionSort(int arr[], int sz) {
	int i, j, min;  
    for (i = 0; i < sz - 1; ++i)  {  
		min = i;  
        for (j = i + 1; j < sz; ++j) {
			if (arr[j] < arr[min])  
				min = j;  
		}
		int tmp  = arr[min];
		arr[min] = arr[i];
		arr[i] = tmp;
	printArray(arr, sz);
    }  
}  


int main(int argc, char **argv){	
	int a [6] = {3, 6, 2, 9, 11, 5};
	selectionSort(a, 6);
	cout << " \n";

	return 0;
}
0

Wypisywanie tablicy umieść po zrobieniu swap() w pętli sortującej.

0

Doszedłem do takiego miejsca i nie umiem posortować tych wartości, pomożecie?

#include <iostream>
#include <vector>
#include <iomanip>

using namespace std;

int ilosc;

void zapytanie() {
	cout << "Podaj ilosc:" << endl;
	cin >> ilosc;
}


void losowanie() {

	srand((unsigned)time(NULL));
	int tab[100];

	for (int i = 0; i < ilosc; i++)
	{
		tab[i] = rand() % 100;
		for (int j = 0; j < i; j++)
		{
			while (tab[j] == tab[i])
			{
				tab[i] = rand() % 100;
			}
		}
	}
	for (int i = 0; i < ilosc; i++)
	{
		cout << setw(4) << tab[i];
	}
}

void Sortowanie(int tab[])
{
	int k;
	for (int i = 0; i < ilosc; i++)
	{
		k = i;
		for (int j = i + 1; j < ilosc; j++)
			if (tab[j] < tab[k])
				k = j;
		swap(tab[k], tab[i]);
	}
}


int main()
{
	zapytanie();
	losowanie();
	
}
0

Przecież podałem Ci, selection sort drukujący pośrednie etapy.

0

Ale nie umiem połączyć twojej funkcji z moimi.
Chcę aby ilosc wylosowanych liczb była wprowadzana przez użytkownika, a tablica z liczbami losowana automatycznie.
Pomożesz?

1

Trochę to trzeba uporządkowac i zmienna, ilosc nie może być globalna, no, no, nie używamy tego.

void selectionSort(int arr[], int sz) {
	int i, j, min;  
    for (i = 0; i < sz - 1; ++i)  {  
		min = i;  
        for (j = i + 1; j < sz; ++j) {
			if (arr[j] < arr[min])  
				min = j;  
		}
		int tmp  = arr[min];
		arr[min] = arr[i];
		arr[i] = tmp;
	printArray(arr, sz);
    }  
}  
void losowanie(int * tab, int sz) {
	srand((unsigned)time(NULL));
    for (int i = 0; i < sz; i++)
		tab[i] = rand() % 100;
}
 
int main() {	
	int tab[100];
    int ilosc;
    cin >> ilosc;
    losowanie(tab, ilosc);
    printArray(tab, ilosc);
    selectionSort(tab, ilosc);
    cout << "\n";
}
0

Mam w takim razie pytanie, jak powinien wyglądać od początku do końca poprawnie napisany kod, który będzie wykonywał polecenia z zadania? Chodzi mi o opis kroków, ewentualnie jakieś wskazówki jak zacząć.

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