Quick actions

cmd+k|ctrl+k

Navigation

Languages

Sort methods

Snippet info

Language

C

Visibility

public

Author

alleciooo

Created

2017-09-01T15:10:00Z

Updated

2017-09-01T16:34:25Z

#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;
}
INFO