Meu código já está fazendo as viradas no array, porém preciso printar na tela uma sequência de viradas que resulte na pilha ordenada. Por exemplo:
Exemplo 1
Exemplo de entrada:
5
5 1 2 3 4
Exemplo de Saída:
1 2 0
Exemplo 2
Exemplo de entrada:
5
5 4 3 2 1
Exemplo de Saída:
1 0
Meu código:
#include <stdlib.h>
#include <stdio.h>
/* Inverte o array[0..i] */
void virar(int arr[], int i) {
int temp, start = 0;
while (start < i)
{
temp = arr[start];
arr[start] = arr[i];
arr[i] = temp;
start++;
i--;
}
}
//Retorna o índice do elemento máximo no array[0..n-1]
int findMax(int arr[], int n) {
int mi, i;
for (mi = 0, i = 0; i < n; ++i)
if (arr[i] > arr[mi])
mi = i;
return mi;
}
// A principal função que sorteia o array usando a função virar
void tapiocaSort(int *arr, int n) {
for (int curr_size = n; curr_size > 1; --curr_size) {
//Encontra o índice do elemento máximo do array[0..curr_size-1]
int mi = findMax(arr, curr_size);
//Move o elemento máximo para o final da matriz atual, se ainda não estiver no final
if (mi != curr_size-1) {
//Para mover para o final do array, primeiro move-se o número máximo para o início
virar(arr, mi);
//Agora move o número máximo para o final, revertendo o array atual
virar(arr, curr_size-1);
}
}
}
//Função para imprimir o array de tamanho n
void printArray(int arr[], int n)
{
for (int i = 0; i < n; ++i)
printf("%d ", arr[i]);
}
int main() {
int n;
scanf("%d", &n);
int vetor[n];
int size = 0;
int value = 0;
//enquanto conseguir ler valores antes de chegar no fim do arquivo
while(scanf("%d ", &value) > 0) {
vetor[size++] = value;
}
tapiocaSort(vetor, n);
puts("Sorted Array ");
printArray(vetor, n);
return 0;
}