二分法

胸怀万里世界, 放眼无限未来。这篇文章主要讲述二分法相关的知识,希望能为你提供帮助。
二分法顾名思义将一段序列一分为二,值得注意的是对于序列首先需先进行排序处理,后进行查找。
数组排序

int main()
int nums[10] = 4, 5, 2, 10, 7, 1, 8, 3, 6, 9;
int i, j, temp;
//冒泡排序算法:进行 n-1 轮比较
for(i=0; i< 10-1; i++)
//每一轮比较前 n-1-i 个,也就是说,已经排序好的最后 i 个不用比较
for(j=0; j< 10-1-i; j++)
if(nums[j] > nums[j+1])
temp = nums[j];
nums[j] = nums[j+1];
nums[j+1] = temp;



【二分法】

查找处理查找元素是用二分法将远远优于元素之间两两对比。二分法是利用下标找到整个数组中位数,并用中位数与查询元素对比,定位所查元素所在中位数一侧,以此循环,知道左下标与右下标一致(因为此时中位数就是本身,下一次循环于此次情况一样无需再进行)。
#define _CRT_SECURE_NO_WARNINGS 1
#include < stdio.h>
int main()

int arr[] =1,2,3,4,5,6,7,8,9,10 ;
int k = 6; //查询的元素
int sz = sizeof(arr)/sizeof(arr[0]); //计算元素个数
int left = 0; //左下标
int right = sz-1; //右下标

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("找到元素下标为:%d\\n", mid);
break; //找到了即跳出整个循环


if (left > right)
printf("找不到!\\n");

return 0;

值得注意的是,mid可能人为计算是一个小数,但是代码中,会进行取整,arr[mid]是存在的。



    推荐阅读