#include <stdio.h>
int count = 0;
void swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
count++;
}
void bubble(int *array, int n)
{
int i;
int j;
for(i = 0; i< n; i++)
{
for(j = 1; j < n - i; j++)
{
if (array[j - 1] > array[j])
{
swap(&array[j - 1], &array[j]);
}
}
}
}
int minkey(int *array, int low, int high)//查找指定范围内的最小值
//第一个参数是一个数组,第二个参数是数组的开始下标,第三个参数是数组的终止下标
//返回值是最小元素的下标
{
int min = low;
int key = array[low];//在没有查找最小元素之前,第一个元素是最小的
int i;
for(i = low + 1; i < high; i++)
{
if ( key > array[i])
{
key = array[i];
count++;
min = i;
}
}
return min;
}
void select(int *array, int n)//选择排序法
{
int i;
for(i = 0; i < n; i++)
{
int j = minkey(array, i, n);
if (i != j)//范围内的第一个成员不是最小的
{
swap(&array[i], &array[j]);
}
}
}
void print(int *array, int n)
{
int i;
for(i = 0; i < n; i++)
{
printf("%d\n", array[i]);
}
}
int seq(int *array, int low, int high, int key)//顺序查找
//在指定范围内寻找和key相同的值,找到返回下标,找不到返回-1
{
int i;
for(i = low; i < high; i++)
{
count++;
if (array[i] == key)
return i;
}
return -1;
}
int bin(int *array, int low, int high, int key)
{
while(low <= high)
{
int mid = (low + high) / 2;
if (key == array[mid])//中间切一刀,正好和要查找的数相等
return mid;
else if (key > array[mid])//如果要找的数大于array[mid],那么就在下半部分继续切刀
low = mid + 1;
else//如果要找的数小于array[mid],那么就在上半部分继续切刀
high = mid - 1;
}
return -1;//没有找到数据
}
int bin_rec(int *array, int low, int high, int key)
{
if (low <= high)//递归终止条件
{
int mid = (low + high) / 2;
if (key == array[mid])
return mid;
else if (key > array[mid])
return bin_rec(array, mid +1, high, key);//在下半部分查找
else
return bin_rec(array, low, mid - 1, key);//在上半部分查找
}else
return -1;
}
int main(void)
{
int array[10] = {32,45,76,21,56,85,23,89,15,49};
//int array[10] = {10, 9,8,7,6,5,4,3,2,1};
//int array[10] = {1,2,3,4,5,6,7,8,9,10};
//bubble(array, 10);
//select(array, 10);
//printf("%d\n", seq(array, 0, 10, 32));
printf("%d\n", bin_rec(array, 0, 10, 76));
printf("-----------------------\n");
print(array, 10);
printf("count = %d\n", count);
return 0;
}
选择排序
最新推荐文章于 2022-08-23 16:09:03 发布