Sort

Run Settings
LanguageC
Language Version
Run Command
#include <stdio.h> #include <stdlib.h> #include <time.h> /*@Author: Alécio Gomes de Souza 2017-09-01 */ /*Percorre o vetor jogando o menor número para a primeira posição*/ void SelectionSort(int *v,int n){ printf("\n\nIniciando Selection Sort...\n\n"); int m,aux; for(int i=0;i< n-1;i++){ m = i; for(int j = i+1;j < n;j++){ if(v[j] < v[m]) m = j; } if(i != m){ aux = v[i]; v[i] = v[m]; v[m] = aux; } } } /*Ordena o vetor deslocando os elementos a partir de um ponto*/ void DirectInsert(int *v,int n){ printf("\n\nIniciando Inserção Direta...\n\n"); int i,j,aux; for(i = 1;i < n; i++){ j = i-1; aux = v[i]; while(j >= 0 && (v[j+1] < v[j]) ){ v[j+1] = v[j]; j--; } v[j+1] = aux; } } /*Desloca elementos até ordenar o vetor*/ void BubbleSort(int *v,int n){ printf("\n\nIniciando BubbleSort...\n\n"); int i,j,troca,aux; j = n-1; do{ troca = 0; for(i = 0; i < j; i++){ if(v[i] > v[i+1]){ aux = v[i]; v[i] = v[i+1]; v[i+1] = aux; troca = 1; } } j--; }while(troca == 1); } /*Similar ao BubbleSort, porém ordena na ida e na volta*/ void ShakerSort(int *v,int n){ printf("\n\nIniciando ShakerSort...\n\n"); int l,r,troca,i,aux; r = n-1; l = troca = 0; while(troca == 0 && l > r){ troca = 1; for(i = l;i<r;i++){ if(v[i] > v[i+1]){ aux = v[i]; v[i] = v[i+1]; v[i+1] = aux; troca = 0; } } r--; for(i = r;i>l;i--){ if(v[i] > v[i-1]){ aux = v[i]; v[i] = v[i-1]; v[i-1] = aux; troca = 0; } } l++; } } /*Utiliza pivos para ordenar o vetor por partes até que esteja completamente ordenado (Recursivo)*/ void QuickSort(int *v,int l,int r){ //printf("\nIniciando QuickSort...\n"); int pv = l,i,j,aux; for(i = l+1; i <= r; i++){ j = i; if(v[j] < v[pv]){ aux = v[j]; while(j > pv){ v[j] = v[j-1]; j--; } v[j] = aux; pv++; } } if(pv-1 >= l) QuickSort(v,l,pv-1); if(pv+1 <= r) QuickSort(v,pv+1,r); } /*QuickSort sem uso de recursão - Adaptada de http://alienryderflex.com/quicksort/ */ void QuickSortNR(int *v, int n) { #define MAX_LEVELS 1000 int pv, beg[MAX_LEVELS], end[MAX_LEVELS], i = 0, L, R ; beg[0] = 0; end[0] = n; while (i>=0){ L = beg[i]; R = end[i]-1; if (L < R){ pv = v[L]; while (L<R){ while (v[R] >= pv && L < R) R--; if (L < R) v[L++] = v[R]; while (v[L] <= pv && L < R) L++; if (L < R) v[R--] = v[L]; } v[L]=pv; beg[i+1] = L+1; end[i+1] = end[i]; end[i++] = L; } else{ i--; } } } /*Divide vetor em vetores menores até chegar em elementos sozinho e volta recursivamente organizando o vetor*/ void MergeSort(int *v, int l, int r){ int i,j,k,mtd,*temp; if(l == r) return; mtd = (l+r)/2; MergeSort(v,l,mtd); MergeSort(v,mtd+1,r); i = l; j = mtd+1; k = 0; temp = (int*) malloc(sizeof(int)*(r-l+1)); while(i < mtd+1 || j < r+1){ if(i == mtd+1){ temp[k] = v[j]; j++; k++; }else{ if(j == r+1){ temp[k] = v[i]; i++; k++; }else{ if(v[i] < v[j]){ temp[k] = v[i]; i++; k++; }else{ temp[k] = v[j]; i++; k++; } } } } for(i = l; i <= r; i++){ v[i] = temp[i-l]; } free(temp); } /*Retornos: 0 - Crescente 1 - Decrescente 2 - Não ordenado */ int IsOrdered(int *v, int n){ int res = 0, change = 0; for(int i = 0; i < n; i++){ if(i < (n-2)){ if(v[i] > v[i+1]){ res = 1; if(i > 0){ return 2; } } } } return res; } int main(void) { srand (time(NULL)); int *v,n,i; //Tamanho do vetor n = 5; v = (int *) malloc(n*sizeof(int)); //Cria vetor for(int i=0;i<n;i++) v[i]= rand() % 100+1; printf("Vetor inicial:\n"); for(int i=0;i<n;i++) printf("%d ",v[i]); //SelectionSort(v,n); //DirectInsert(v,n); //BubbleSort(v,n); //ShakerSort(v,n); //QuickSort(v,0,(n-1)); QuickSortNR(v,n); printf("\nVetor ordenado:\n"); for(int i=0;i<n;i++) printf("%d ",v[i]); int *vec = (int *) malloc(3*sizeof(int)); vec[0] = 3; vec[1] = 2; vec[2] = 1; printf("\n\nOrdenado: %d",IsOrdered(v,n)); return 0; }
Editor Settings
Theme
Key bindings
Full width
Lines