semestre_2/Algoritmos e Estruturas de Dados I/Semana 03/sorts.c

84 lines
1.7 KiB
C
Raw Normal View History

2021-10-17 22:56:35 +02:00
#include <stdlib.h>
2021-10-01 20:48:56 +02:00
void swap (int *a, int *b) {
int tmp = *a;
*a = *b;
*b = tmp;
}
2021-10-17 22:56:35 +02:00
int *merge (int *array1, int size1, int *array2, int size2) {
int k, i, j, *array3 = malloc((size1 + size2) * sizeof(*array3));
for (k = i = j = 0; k < size1 + size2; k++)
array3[k] = ((i < size1 && array1[i] <= array2[j]) || j >= size2) ? array1[i++] : array2[j++];
return array3;
}
int partition (int *array, int size) {
int i = -1, j;
for (j = 0; j < size - 1; j++)
if (array[j] <= array[size - 1])
swap(&array[++i], &array[j]);
swap(&array[++i], &array[j]);
return i;
}
void bubbleSort (int *array, int size) {
2021-10-01 20:48:56 +02:00
int i;
2021-10-17 22:56:35 +02:00
if (size <= 1)
2021-10-01 20:48:56 +02:00
return;
2021-10-17 22:56:35 +02:00
for (i = 0; i < size; i++)
if (array[i] > array[i + 1])
swap(&array[i], &array[i + 1]);
bubbleSort(array, size - 1);
2021-10-01 20:48:56 +02:00
}
2021-10-17 22:56:35 +02:00
void selectionSort (int *array, int size) {
2021-10-01 20:48:56 +02:00
int i, pos = 0;
2021-10-17 22:56:35 +02:00
if (size <= 1)
2021-10-01 20:48:56 +02:00
return;
2021-10-17 22:56:35 +02:00
for (i = 1; i < size; i++)
if (array[i] < array[pos])
2021-10-01 20:48:56 +02:00
pos = i;
2021-10-17 22:56:35 +02:00
swap(array, &array[pos]);
selectionSort(array + 1, size - 1);
2021-10-01 20:48:56 +02:00
}
2021-10-17 22:56:35 +02:00
void insertionSort (int *array, int size) {
2021-10-01 20:48:56 +02:00
int i, tmp;
2021-10-17 22:56:35 +02:00
if (size <= 1)
2021-10-01 20:48:56 +02:00
return;
2021-10-17 22:56:35 +02:00
insertionSort(array, size - 1);
tmp = array[size - 1];
for (i = size - 2; i >= 0 && array[i] > tmp; i--)
array[i + 1] = array[i];
array[i + 1] = tmp;
}
void mergeSort(int *array, int size) {
int *tmp, i, m = size / 2;
if (size > 1) {
mergeSort(array, m);
mergeSort(array + m, size - m);
}
tmp = merge(array, m, array + m, size - m);
for (i = 0; i < size; i++)
array[i] = tmp[i];
}
void quickSort (int *array, int size) {
int pivot;
if (size <= 1)
return;
pivot = partition(array, size);
quickSort(array, pivot);
quickSort(array + (pivot + 1), size - (pivot + 1));
2021-10-01 20:48:56 +02:00
}