make bitonic work for non 2^n
This commit is contained in:
@@ -15,6 +15,36 @@
|
||||
|
||||
#include "swap.h"
|
||||
|
||||
/**
|
||||
* Verificar si x es de 2^n
|
||||
* @param x El valor a verificar
|
||||
* @return Retorna 1 si es de 2^n ó 0 al contrario;
|
||||
*/
|
||||
int power_of_two(int n) {
|
||||
if (n == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
while (n != 1) {
|
||||
if (n % 2 != 0) {
|
||||
return 0;
|
||||
}
|
||||
n = n / 2;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
#include <stdio.h>
|
||||
int greatest_power_of_two_less_than(int n) {
|
||||
int k = 1;
|
||||
while (k > 0 && k < n) {
|
||||
k = (int) ((unsigned int) k << 1);
|
||||
}
|
||||
k = (int) ((unsigned int) k >> 1);
|
||||
return (int) k;
|
||||
//return k>>>1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Comparar y intercambiar los valores para darle orden
|
||||
* @param i El primer indice a comparar
|
||||
@@ -31,16 +61,16 @@ void compare(int i, int j, int dir, int *array) { //
|
||||
/**
|
||||
* Unir la secuencia
|
||||
* @param low El parte inferior
|
||||
* @param c El parte superior
|
||||
* @param c El parte superior n
|
||||
* @param dir La dirección a ordenar, 1 para ascendentemente o 0 por descendentamente
|
||||
* @param array El array a ordenar
|
||||
*/
|
||||
void bitonicmerge(int low, int c, int dir, int *array) {
|
||||
void bitonicmerge(int low, int n, int dir, int *array) {
|
||||
int i;
|
||||
int k;
|
||||
|
||||
if (c > 1){
|
||||
k = c / 2;
|
||||
if (n > 1) {
|
||||
k = n / 2;
|
||||
for (i = low; i < low + k; i++){
|
||||
compare(i, i + k, dir, array);
|
||||
}
|
||||
@@ -50,20 +80,59 @@ void bitonicmerge(int low, int c, int dir, int *array) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Generar la secuencia bitonica en forma de piramide
|
||||
* Unir la secuencia
|
||||
* @param low El parte inferior
|
||||
* @param c El parte superior
|
||||
* @param c El parte superior n
|
||||
* @param dir La dirección a ordenar, 1 para ascendentemente o 0 por descendentamente
|
||||
* @param array El array a ordenar
|
||||
*/
|
||||
void recbitonic(int low, int c, int dir, int *array) {
|
||||
void bitonicmerge_no2(int low, int n, int dir, int *array) {
|
||||
int i;
|
||||
int k;
|
||||
|
||||
if (c > 1){
|
||||
k = c / 2;
|
||||
if (n > 1) {
|
||||
k = greatest_power_of_two_less_than(n);
|
||||
for (i = low; i < low + n-k; i++){
|
||||
compare(i, i + k, dir, array);
|
||||
}
|
||||
bitonicmerge_no2(low, k, dir, array);
|
||||
bitonicmerge_no2(low + k, n - k, dir, array);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Generar la secuencia bitonica en forma de piramide
|
||||
* @param low El parte inferior
|
||||
* @param c El parte superior n
|
||||
* @param dir La dirección a ordenar, 1 para ascendentemente o 0 por descendentamente
|
||||
* @param array El array a ordenar
|
||||
*/
|
||||
void recbitonic(int low, int n, int dir, int *array) {
|
||||
int k;
|
||||
|
||||
if (n > 1){
|
||||
k = n / 2;
|
||||
recbitonic(low, k, 1, array);
|
||||
recbitonic(low + k, k, 0, array);
|
||||
bitonicmerge(low, c, dir, array);
|
||||
bitonicmerge(low, n, dir, array);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Generar la secuencia bitonica en forma de piramide
|
||||
* @param low El parte inferior
|
||||
* @param c El parte superior n
|
||||
* @param dir La dirección a ordenar, 1 para ascendentemente o 0 por descendentamente
|
||||
* @param array El array a ordenar
|
||||
*/
|
||||
void recbitonic_no2(int low, int n, int dir, int *array) {
|
||||
int k;
|
||||
|
||||
if (n > 1){
|
||||
k = n / 2;
|
||||
recbitonic_no2(low, k, !dir, array);
|
||||
recbitonic_no2(low + k, n - k, dir, array);
|
||||
bitonicmerge_no2(low, n, dir, array);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -74,7 +143,12 @@ void recbitonic(int low, int c, int dir, int *array) {
|
||||
* @param dir La dirección a ordenar, 1 para ascendentemente o 0 por descendentamente
|
||||
*/
|
||||
void sort(int *array, int n, int dir) {
|
||||
recbitonic(0, n, dir, array);
|
||||
if (power_of_two(n)) {
|
||||
recbitonic(0, n, dir, array);
|
||||
}
|
||||
else {
|
||||
recbitonic_no2(0, n, dir, array);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -83,5 +157,5 @@ void sort(int *array, int n, int dir) {
|
||||
* @param n El tamaño del array
|
||||
*/
|
||||
void bitonic_sort(int *array, int n) {
|
||||
sort(array, n, 1);
|
||||
sort(array, n, 1);
|
||||
}
|
||||
|
Reference in New Issue
Block a user