随着对c语言的加深,分别学会了二分法的从小到大的查询,和冒泡排序。通过这两个算法,我想现在可以写一个乱序的二分查找,就是将我所学的结合起来。以下就是结合后的代码。如果需要看顺序的二分查找和冒泡排序可以看我之前写的文章。当然,如果有什么问题请指出来我也会不断的改进。
#include<stdio.h>
bubblr_sort(int arr[],int sz)
{
int j = 0;
for (j = 0; j < sz-1;j++)
{
int a=0;
int flow = 0;//假设这一次要排的数据已经有序;
for (a = 0; a<sz - j - 1;a++)
{
if (arr[a] > arr[a + 1])
{
int set = arr[a];
arr[a] = arr[a + 1];
arr[a + 1] = set;
flow = 1;//本趟排序的数据不完全有序
}
}
if (flow == 0)//如果已经有序,就可以跳出循环了,提高了效率;
{
break;
}
}
}
int main()
{
int arr[10];
int b = 0;
for (b = 0; b < 10; b++)
{
scanf("%d", &arr[b]);
}
int sz = sizeof(arr) / sizeof(arr[0]);
bubblr_sort(arr,sz);//调用排序函数,对输入的无序数组进行从小到大的排序
int i = 0;
printf("排序之后的数组为:");
for (i = 0; i < sz; i++) //输入排序之后的数组
{
printf("%d ", arr[i]);
}
//利用二分法来查找k
int left = 0; //左下标
int right = sz - 1; //右下标
printf("\n输入你要查找的数:\n");
int k = 0;
scanf("%d", &k);
while (left <= right)
{
int mid = (left + right) / 2;//求中间元素的下标
if (arr[mid] > k) //如果中间元素大于所求元素,说明所求元素在中间元素的左
//边,则右下标变为中间元素的左边第一个元素的下标,左下
//标不变
{
right = mid - 1;
}
else if (arr[mid] < k) //如果中间元素小于所求元素,说明所求元素在中间元素的右
//边,则左下标变为中间元素的右边第一个元素的下标,右下标
//不变;
{
left = mid + 1;
}
else{
printf("\n找到了 下标是%d\n", mid);
break;
}
}
if (left>right)
{
printf("\n找不到\n");
}
}