Logo Hardware.com.br
Erica Olmo Borges
Erica Olmo B... Novo Membro Registrado
5 Mensagens 5 Curtidas

Ordenação QuickSort em linguagem C (iniciante)

#1 Por Erica Olmo B... 03/06/2020 - 11:22
Tenho uma atividade para fazer na qual preciso ordenar 10 elementos de um vetor em quicksort em linguagem C.
Tenho o sguinte codigo abaixo, o prolema é que quando coloco os 10 elementos ele só imprime a parte desordenada, já a parte ordenada não imprime, somente se estiver com 6 elementos ou menos

[code=c]#include
#include

const int tamanho = 10;
char vetor[tamanho] = {'6', '7', '5', '4', '9', '8', '3', '8', '1', '2'};


/*imprimeVetor(){
for(int i = 0; i <= tamanho -1; i++){
printf("%c ", vetor[i]);
}
}*/

quickSort(char vet[], int inicio, int fim){ //aonde inicia e aonde finaliza o pivot
if(inicio < fim){ //se o meu inicio for menor que o fim
char pivot = vet[inicio]; //determina quem é o pivo
char temp;
int i = inicio;
int f = fim;
while (true){
while(pivot < vet[f]){ //enquanto o pivo for menor que o pivo naposição final
f--;
}
while(pivot > vet[i]){ //enquando meu pivo for maior que inicial
i++;
}
if (i >= f){
break;
}
temp = vet[i];
vet[i] = vet[f];
vet[f] = temp;
}
//a rotina chama ela mesma
quickSort(vet, inicio, f);
quickSort(vet, f +1, fim);
}
}

main(){
setlocale(LC_ALL, "Portuguese");
printf("Vetor antes da ordenação: ");
for(int i = 0; i <= tamanho -1; i++){
printf("\nVetor %d: %c ", i, vetor[i]);
}
// imprimeVetor();

quickSort(vetor, 0, tamanho -1);

printf("\n\nVetor depois da ordenação: ");
for(int i = 0; i <= tamanho -1; i++){
printf("\nVetor %d: %c ", i, vetor[i]);
}
/// imprimeVetor();
}[/code]

Anexos

Olavo França
Olavo França General de Pijama Registrado
2.8K Mensagens 587 Curtidas
#2 Por Olavo França
03/06/2020 - 12:05
Boa tarde Erica...
Faz tempo que não programo em C tem mais de 15 anos, não sei se vai rodar, mas tente fazer assim.

for(int i = 0; i <= tamanho -1; i++){
printf("%c ", vetor[i]);


printf("Vetor antes da ordenação: &quot;
for(int i = 0; i <= tamanho -1; i++){
printf("\nVetor %d: %c ", i, vetor[i]);


printf("\n\nVetor depois da ordenação: &quot;
for(int i = 0; i <= tamanho -1; i++){
printf("\nVetor %d: %c ", i, vetor[i]);
}
Mobo Gigabyte B660M DS3H DDR4 - CPU Core i7 - 12700F 2.1 GHz - RAM 2x8GB + 2x16GB = 48GB 3200MHz DDR4 -
Corsair CX650M - 650 Watts -  GTX 1660 Super OC 6GB GDDR6
, SSD Sata de 500GB, NVMe de 1TB e HD de 2TB - Windows 11 Pro - 64 bits.
Não acreditar em Deus, é duvidar da própria existência de tudo....bom_trabalho.gifi
Olavo França
Olavo França General de Pijama Registrado
2.8K Mensagens 587 Curtidas
#4 Por Olavo França
03/06/2020 - 13:36
Não tenho certeza se o problema "erro" está aqui.

quickSort(vet[], inicio, f);
quickSort(vet[], f +1, fim);


quickSort(vetor[], 0, tamanho -1);


Se não for, espero que alguém com mais experiência consiga lhe ajudar

Dei uma analisada com mais calma.
Na rotina quicksort você ordena o vetor vet[], mas mostra o valor vetor.
Mobo Gigabyte B660M DS3H DDR4 - CPU Core i7 - 12700F 2.1 GHz - RAM 2x8GB + 2x16GB = 48GB 3200MHz DDR4 -
Corsair CX650M - 650 Watts -  GTX 1660 Super OC 6GB GDDR6
, SSD Sata de 500GB, NVMe de 1TB e HD de 2TB - Windows 11 Pro - 64 bits.
Não acreditar em Deus, é duvidar da própria existência de tudo....bom_trabalho.gifi
Olavo França
Olavo França General de Pijama Registrado
2.8K Mensagens 587 Curtidas
#6 Por Olavo França
03/06/2020 - 15:43
Boa tarde Erica Olmo Borges...

Dei uma olhada com mais calma e notei que na função QuickSort você ordena o vetor vet[], mas nesta parte você volta a imprimir o vetor original vetor, ou seja, não imprime o vetor vet[], que é o vetor que você ordenou:

printf("\n\nVetor depois da ordenação: &quot;
for(int i = 0; i <= tamanho -1; i++){
printf("\nVetor %d: %c ", i, vetor[i]);
}
Mobo Gigabyte B660M DS3H DDR4 - CPU Core i7 - 12700F 2.1 GHz - RAM 2x8GB + 2x16GB = 48GB 3200MHz DDR4 -
Corsair CX650M - 650 Watts -  GTX 1660 Super OC 6GB GDDR6
, SSD Sata de 500GB, NVMe de 1TB e HD de 2TB - Windows 11 Pro - 64 bits.
Não acreditar em Deus, é duvidar da própria existência de tudo....bom_trabalho.gifi
Olavo França
Olavo França General de Pijama Registrado
2.8K Mensagens 587 Curtidas
#8 Por Olavo França
03/06/2020 - 16:23
Erica Olmo Borges disse:


Dá erro de variável não declarada porque o vetor vet[] é uma variável "vetor" declarada dentro da função QuickSort, ou seja, ela só é reconhecida dentro da função.
Mobo Gigabyte B660M DS3H DDR4 - CPU Core i7 - 12700F 2.1 GHz - RAM 2x8GB + 2x16GB = 48GB 3200MHz DDR4 -
Corsair CX650M - 650 Watts -  GTX 1660 Super OC 6GB GDDR6
, SSD Sata de 500GB, NVMe de 1TB e HD de 2TB - Windows 11 Pro - 64 bits.
Não acreditar em Deus, é duvidar da própria existência de tudo....bom_trabalho.gifi
Olavo França
Olavo França General de Pijama Registrado
2.8K Mensagens 587 Curtidas
#10 Por Olavo França
03/06/2020 - 18:22
Boa noite Erica...
Refiz o código, mas não sei está do jeito que você quer.


#include <conio.h>
#include <stdio.h>
#include <locale.h>

const int Tamanho = 10;
int Aux, Aux_II;
int TesteSeOrdenado;

char Vetor[Tamanho] = {'6', '7', '5', '4', '9', '8', '3', '8', '1', '2'};

main(){
setlocale(LC_ALL, "Portuguese&quot;
printf("Vetor antes da ordenação: &quot;
for(int i = 0; i <= Tamanho -1; i++){
printf("\nVetor %d: %c ", i, Vetor[i]);
}
Aux_II = Tamanho;
for(int x = 0; x <= Tamanho; x++){
TesteSeOrdenado = 1; // Considera que o vetor já está ordenado
Aux_II --;
for(int i = 0; i < Aux_II; i++) {
if (Vetor[i] > Vetor[i + 1]) {
Aux = Vetor[i + 1];
Vetor[i + 1] = Vetor[i];
Vetor[i] = Aux;
TesteSeOrdenado = 0; // Caso houver troca, o vetor não está
// ordenado
}
}
if (TesteSeOrdenado == 1) {
break;
}
}
printf("\n\nVetor depois da ordenação: &quot;
for(int i = 0; i <= Tamanho -1; i++){
printf("\nVetor %d: %c ", i, Vetor[i]);
}
getch();
}
Mobo Gigabyte B660M DS3H DDR4 - CPU Core i7 - 12700F 2.1 GHz - RAM 2x8GB + 2x16GB = 48GB 3200MHz DDR4 -
Corsair CX650M - 650 Watts -  GTX 1660 Super OC 6GB GDDR6
, SSD Sata de 500GB, NVMe de 1TB e HD de 2TB - Windows 11 Pro - 64 bits.
Não acreditar em Deus, é duvidar da própria existência de tudo....bom_trabalho.gifi
Olavo França
Olavo França General de Pijama Registrado
2.8K Mensagens 587 Curtidas
#11 Por Olavo França
05/06/2020 - 22:49
Boa noite Erica...

Como eu lhe disse já tem mais de 15 anos que não programo em C, Na realidade só mexo com Banco de Dados.
Peço desculpa, mas o método acima não é o QuickSort e sim BubbleSort.

Tomei como desafio e pesquisei na internet o algoritmo do QuickSort.
Recomendo você pesquisar na internet usando o Google Chrome e digite o método que quer entender, no caso QuickSort.

OBS.: Achei este código "rotina" QuickSort na internet. Só fiz alguma pequena atualização (alteração).


#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <time.h>

const int Tamanho = 10;
int Vetor[Tamanho];

//int Vetor[Tamanho] = {'6', '7', '5', '4', '9', '8', '3', '8', '2', '1'};

void *ImprimeVetor(){
for(int i = 0; i <= Tamanho -1; i++) {
printf("\nVetor %d: %d ", i, Vetor[i]);
}
}

void GeraNumeroAleatorio(int Tamanho_II) {

srand(time(NULL));
for (int t = 0; t < Tamanho_II; t++) {
Vetor[t] = (rand() % 100);
}
}

void Quick_Sort(int *Vet, int Left, int Right) {

int Aux, Pivor, L, R;

L = Left;
R = Right;
Pivor = Vet[(Left + Right) / 2];

while(L <= R) {
while(Vet[L] < Pivor && L < Right) {
L++;
}
while(Vet[R] > Pivor && R > Left) {
R--;
}
if(L <= R) {
Aux = Vet[L];
Vet[L] = Vet[R];
Vet[R] = Aux;
L++;
R--;
}
}
if(R > Left) {
Quick_Sort(Vet, Left, R);
}
if(L < Right) {
Quick_Sort(Vet, L, Right);
}
}
main(){
GeraNumeroAleatorio(Tamanho);

setlocale(LC_ALL, "Portuguese&quot;
printf("Vetor antes da ordenação: &quot;
ImprimeVetor();

Quick_Sort(Vetor, 0, Tamanho-1);

printf("\n\nVetor depois da ordenação: &quot;
ImprimeVetor();

getch();
}


Um grande abraço.
Mobo Gigabyte B660M DS3H DDR4 - CPU Core i7 - 12700F 2.1 GHz - RAM 2x8GB + 2x16GB = 48GB 3200MHz DDR4 -
Corsair CX650M - 650 Watts -  GTX 1660 Super OC 6GB GDDR6
, SSD Sata de 500GB, NVMe de 1TB e HD de 2TB - Windows 11 Pro - 64 bits.
Não acreditar em Deus, é duvidar da própria existência de tudo....bom_trabalho.gifi
Olavo França
Olavo França General de Pijama Registrado
2.8K Mensagens 587 Curtidas
#12 Por Olavo França
06/06/2020 - 11:39
Bom dia companheiros.

Eu fiz algumas alterações no código no post anterior a este. Mas não consegui fazer na linguagem C e sim na linguagem C++.
Aprendi um pouco mais na linguagem C++.
Espero ter ajudado.
Mobo Gigabyte B660M DS3H DDR4 - CPU Core i7 - 12700F 2.1 GHz - RAM 2x8GB + 2x16GB = 48GB 3200MHz DDR4 -
Corsair CX650M - 650 Watts -  GTX 1660 Super OC 6GB GDDR6
, SSD Sata de 500GB, NVMe de 1TB e HD de 2TB - Windows 11 Pro - 64 bits.
Não acreditar em Deus, é duvidar da própria existência de tudo....bom_trabalho.gifi
© 1999-2025 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal