#include <stdio.h>
#include <time.h>
int findKey(int nums[], int key, int length);
int findKey2(int nums[], int length, int key);
int findKey3(int nums[], int length, int key);
int main(int argc, const char * argv[]) {
// 现在已知一个有序的数组, 和一个key. 要求从数组中找到key对应的索引的位置
// 对该方法进行封装, 要求找到就返回对应的索引, 找不到就返回-1
int nums[500000] = {1, 3, 5, 7, 9, [499999] = 99};
int key = 99;
int length = sizeof(nums) / sizeof(nums[0]);
/*
// 消耗了多少1181毫秒
clock_t startTime = clock();
int index = findKey(nums, key, length);
clock_t endTime = clock();
printf("消耗了多少%lu毫秒\n", endTime - startTime);
printf("index = %i\n", index);
*/
// 消耗了多少1毫秒
clock_t startTime = clock();
// int index = findKey2(nums, length, key);
// 消耗了多少2毫秒
int index = findKey3(nums, length, key);
clock_t endTime = clock();
printf("消耗了多少%lu毫秒\n", endTime - startTime);
printf("index = %i\n", index);
return 0;
}
int findKey3(int nums[], int length, int key)
{
int min, max, mid;
min = 0;
max = length - 1;
// 只要还在我们的范围内就需要查找
while (min <= max) {
// 计算中间值
mid = (min + max) / 2;
if (key > nums[mid]) {
min = mid + 1;
}else if (key < nums[mid])
{
max = mid - 1;
}else
{
return mid;
}
}
return -1;
}
int findKey2(int nums[], int length, int key)
{
int min, max, mid;
min = 0;
max = length - 1;
mid = (min + max) / 2;
while (key != nums[mid]) {
// 判断如果要找的值, 大于了取出的值, 那么min要改变
if (key > nums[mid]) {
min = mid + 1;
// 判断如果要找的值, 小雨了取出的值, 那么max要改变
}else if (key < nums[mid])
{
max = mid - 1;
}
// 超出范围, 数组中没有需要查找的值
if (min > max) {
return -1;
}
// 每次改变完min和max都需要重新计算mid
mid = (min + max) / 2;
}
// printf("aaaaaa\n");
return mid;
}
int findKey(int nums[], int key, int length)
{
for (int i = 0; i < length; i++) {
if (nums[i] == key) {
// printf("%i\n", i);
return i;
}
}
return -1;
}
1、首先前提是排好序,数据量不大可以用桶排序
2、算出中间数的索引值
3、循环比较min和max索引之间的数
4、根据min和max算出中间索引值
5、如果要找的数大于中间值,重新赋值min为mid+1,重新进行3-5;如果要找的数小于中间值,重新赋值max为mid-1,重新进行3-5;否则,当前索引即为要找的数的索引
二分查找应用之选择插入的位置使数组依然顺序
#include <stdio.h>
int insertValue(int nums[], int length, int key);
int main(int argc, const char * argv[]) {
// 现有一个有序的数组, 要求给定一个数字, 将该数字插入到数组中, 还要保证数组是有序的
// 其实就是找到需要插入数字的位置
// 其实这个位置就是min的位置
/*
min = 0
max = 4
mid = 2
*/
// 0 1 2 3 4 5
int nums[5] = {1, 3, 5, 7,9};
int key = 4;
int length = sizeof(nums) / sizeof(nums[0]);
printf("需要插入的位置是%i\n", insertValue(nums, length, key));
return 0;
}
int insertValue(int nums[], int length, int key)
{
int min , max, mid;
min = 0;// 1 2
max = length - 1;// 4 1
while (min <= max) {
mid = (min + max) / 2; // 2 0 1
if (key > nums[mid]) {
min = mid + 1;
}else if (key < nums[mid])
{
max = mid - 1;
}
}
return min;
}