#include <stdio.h>
void merge(int *arr, int l, int m, int r)
{
int i, tt[r - l + 1];
int cp = 0, lp = l, rp = m + 1;
while(lp <= m && rp <= r) {
if(arr[lp] < arr[rp]) tt[cp++] = arr[lp++];
else tt[cp++] = arr[rp++];
}
while(lp <= m) tt[cp++] = arr[lp++];
while(rp <= r) tt[cp++] = arr[rp++];
for(i = 0; i < cp; i++) {
arr[l + i] = tt[i];
}
return;
}
void merge_sort(int *arr, int l, int r)
{
if(l < r){
int m = (l + r) / 2;
merge_sort(arr, l, m);
merge_sort(arr, m + 1, r);
merge(arr, l, m, r);
}
}
int binsearch(int *arr, int size, int key)
{
int l = 0;
int r = size - 1;
int m;
while (l <= r) {
m = (l + r) >> 1;
if(key > arr[m]) l = m + 1;
else if (key < arr[m]) r = m - 1;
else return m;
}
return -1;
}
int main()
{
int arr[16] = {
5, 11, 81, 7, 99, 77, 23, 90,
17, 55, 4, 188, 518, 3, 66, 110
};
int i, size = sizeof(arr) / sizeof(int);
merge_sort(arr, 0, size - 1);
for(i = 0; i < size; i++){
printf("%d ",arr[i]);
}
printf("\n");
i = binsearch(arr, size, 188);
if(i != -1) printf("arr[%d] = %d\n", i, arr[i]);
return 0;
}