sortowanie po spirali

0

Problem z jakim nie mogę sobie poradzić dotyczy sortowania tablicy kwadratowej po spirali a dokładnie napisania funkcji która pobiera współrzędne elementu i zwraca kolejny element(w porządku spirali). Wówczas napisanie funkcji sortującej nie będzie problemem. Za każą podpowiedź będę wdzięczny.

Zapomniałem dodać że sortowanie ma działać w miejscu.

0

opisz dokładniej na czym polega porządek spirali albo wklej jakiegos linka

0

Pewnie spirala to coś takiego:
user image

0

Problem rozwiązany. Prawdopodobnie istnieje lepsze rozwiązanie choćby poprzez zastosowanie sortowania szybkiego.

int* next(int y, int x, int n, int **A)
{
	int *tab = new int[2];
	if (!(y==n/2 && x== (n-1)/2)){
	if (x>(n-1)/2)
	{
		if (y>=(n-1)-x && y < x){
			tab[0] = y+1;
			tab[1] = x;
			return tab;
			}
	
		else{
			if (y<=(n-1)/2){
				tab[0] = y;
                        	tab[1] = x+1;
                        	return tab;
				}
			else{
				tab[0] = y;
                        	tab[1] = x-1;
                        	return tab;
			}
		}
	}
	else
	{
		if (y<=(n-1)-x && y > x+1){	
			tab[0] = y-1;
                        tab[1] = x;
                        return tab;
			}
		else{
			if (y<=(n-1)/2){
				tab[0] = y;
                        	tab[1] = x+1;
                        	return tab;

			}
                        else{
				tab[0] = y;
                        	tab[1] = x-1;
                        	return tab;
			}
		}
	}}
	else 
	{	
		tab[0] = 0;
		tab[1] = 0;	
		return tab;	
	}
		
}

void min(int y, int x, int n, int **A)
{
	int *tab = new int[2];	
	int *min = new int[2];
	tab[0] = y;
	tab[1] = x;
	min[0] = y;
	min[1] = x;
	for (int i = 0; i<n*n; i++){
		tab = next(tab[0],tab[1],n,A);
		if (tab[0] == 0 && tab[1] == 0)
			break;
		if (A[tab[0]][tab[1]] < A[min[0]][min[1]] ){
			min = tab;}
	}
	int temp = A[y][x];
	A[y][x] = A[min[0]][min[1]];
	A[min[0]][min[1]] = temp;
}

void sort(int ** arr, int N){
	int j = N-1;
    for(int i=0;  j >= 0;  i++, j--){
        for(int k = i ; k < j; k++){ min(i,k,N,arr); } 
        for(int k = i ; k < j; k++){ min(k, j, N, arr); }
        for(int k = j ; k > i; k--){ min(j, k, N, arr); }
        for(int k = j ; k > i; k--){ min(k, i, N, arr);}
    }
}
0

Najlepiej byłoby najpierw rozwinąć spiralę do osobnej tablicy, posortować tą osobną tablicę, a na końcu zwinąć tą tablicę z powrotem.

0

@donkey, dobry pomysł ale

Zapomniałem dodać że sortowanie ma działać w miejscu.

0

Zgadza się, ale nie można korzystać z dodatkowej tablicy. Algorytm ma działać in situ.

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