programming-examples/c/Search_Sorting/C Program to Implement Bitonic sort.c
2019-11-15 12:59:38 +01:00

99 lines
1.9 KiB
C

/*
* C Program to Implement Bitonic sort
*/
#include <stdio.h>
#include <stdlib.h>
#define MAX 8
#define SWAP(x,y) t = x; x = y; y = t;
void compare();
void bitonicmerge(int, int, int);
void recbitonic(int, int, int);
void sort();
int data[MAX];
int up = 1;
int down = 0;
int main()
{
int i;
printf("\nEnter the data");
for (i = 0; i < MAX ; i++)
{
scanf("%d", &data[i]);
}
sort();
for (i = 0; i < MAX; i++)
{
printf("%d ", data[i]);
}
}
/*
* compare and swap based on dir
*/
void compare(int i, int j, int dir)
{
int t;
if (dir == (data[i] > data[j]))
{
SWAP(data[i], data[j]);
}
}
/*
* Sorts a bitonic sequence in ascending order if dir=1
* otherwise in descending order
*/
void bitonicmerge(int low, int c, int dir)
{
int k, i;
if (c > 1)
{
k = c / 2;
for (i = low; i < low+k ; i++)
compare(i, i+k, dir);
bitonicmerge(low, k, dir);
bitonicmerge(low+k, k, dir);
}
}
/*
* Generates bitonic sequence by sorting recursively
* two halves of the array in opposite sorting orders
* bitonicmerge will merge the resultant data
*/
void recbitonic(int low, int c, int dir)
{
int k;
if (c > 1)
{
k = c / 2;
recbitonic(low, k, up);
recbitonic(low + k, k, down);
bitonicmerge(low, c, dir);
}
}
/*
* Sorts the entire array
*/
void sort()
{
recbitonic(0, MAX, up);
}
/*
*OUTPUT:
/*Average case
Enter the data
3 5 8 9 7 4 2 1
1 2 3 4 5 7 8 9
$ a.out
/*Worst case
Enter the data
100 99 98 97 96 95 94 93
93 94 95 96 97 98 99 100
/*Best case
Enter the data
1111 2222 3333 4444 5555 6666 7777 8888
1111 2222 3333 4444 5555 6666 7777 8888
*/