递归折半查找多个相同元素中的第一个或者最后一个
来源:互联网 发布:cf网络异常的解决办法 编辑:程序博客网 时间:2024/05/21 18:39
/***********************************************************************
如果待查找的元素在数组中有多个,则返回其中任意一个(第一个或者最后一个)
************************************************************************/
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
void TraversalArray(int array[], int len)
{
assert(array != NULL);
assert(len >= 0);
unsigned index = -1;
for(index = 0; index < len; index++)
{
printf("%3d", array[index]);
}
printf("\n");
}
int Is_Sort(int array[], int low, int high)
{
int i = -1;
for(i = low; i < high-1; i++)
{
if(array[i] > array[i+1])
{
return 0;
}
}
return 1;
}
int BinarySearch(int array[], int low, int high, int key)
{
if(low > high)
{
return -1;
}
assert(array != NULL);
assert(Is_Sort(array, low, high));
if(key == array[low])
{
return low;//打开这个 if(),则找到第一个要找的元素
}
/*
if(key == array[high])
{
return high;//打开这里的 if(),则找到最后一个要查找的元素
}
*/
int mid = (low + high)/2;
if(key == array[mid])
{
return BinarySearch(array, low, mid, key);/*递归继续查找特殊位置的元素*/
}
else if(key < array[mid])
{
return BinarySearch(array, low, mid-1, key);/*在小的那一段继续折半查找*/
}
else
{
return BinarySearch(array, mid+1, high, key);/*在大的那一半继续折半查找*/
}
}
int main(void)
{
int array[] = {0, 1, 2, 2, 2, 3, 4, 5, 6, 7, 8, 9};
TraversalArray(array, sizeof(array)/sizeof(array[0]));
int index = BinarySearch(array, 0, sizeof(array)/sizeof(array[0])-1, 2);
printf("index = %d \n", index);
return 0;
}
如果待查找的元素在数组中有多个,则返回其中任意一个(第一个或者最后一个)
************************************************************************/
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
void TraversalArray(int array[], int len)
{
assert(array != NULL);
assert(len >= 0);
unsigned index = -1;
for(index = 0; index < len; index++)
{
printf("%3d", array[index]);
}
printf("\n");
}
int Is_Sort(int array[], int low, int high)
{
int i = -1;
for(i = low; i < high-1; i++)
{
if(array[i] > array[i+1])
{
return 0;
}
}
return 1;
}
int BinarySearch(int array[], int low, int high, int key)
{
if(low > high)
{
return -1;
}
assert(array != NULL);
assert(Is_Sort(array, low, high));
if(key == array[low])
{
return low;//打开这个 if(),则找到第一个要找的元素
}
/*
if(key == array[high])
{
return high;//打开这里的 if(),则找到最后一个要查找的元素
}
*/
int mid = (low + high)/2;
if(key == array[mid])
{
return BinarySearch(array, low, mid, key);/*递归继续查找特殊位置的元素*/
}
else if(key < array[mid])
{
return BinarySearch(array, low, mid-1, key);/*在小的那一段继续折半查找*/
}
else
{
return BinarySearch(array, mid+1, high, key);/*在大的那一半继续折半查找*/
}
}
int main(void)
{
int array[] = {0, 1, 2, 2, 2, 3, 4, 5, 6, 7, 8, 9};
TraversalArray(array, sizeof(array)/sizeof(array[0]));
int index = BinarySearch(array, 0, sizeof(array)/sizeof(array[0])-1, 2);
printf("index = %d \n", index);
return 0;
}
0 0
- 递归折半查找多个相同元素中的第一个或者最后一个
- 顺序数组查找第一个和最后一个给定元素
- 二分查找、二分查找小于等于key的最后一个元素、二分查找大于等于key的第一个元素
- 二分查找(返回目标元素的第一个位置、最后一个位置)
- 二分查找(返回目标元素的第一个位置、最后一个位置)
- PHP 删除数组第一个元素和最后一个元素
- PHP 删除数组第一个元素和最后一个元素
- 容器的最后一个元素是否大于第一个元素
- 去掉ViewPager滑到第一个或者最后一个效果
- php 获取数组第一个元素 以及最后一个元素 && 最后一个元素的键名
- 34. Search for a Range(二分查找有重复元素数组中的目标数的第一个位置和最后一个位置)
- jquery如何获取第一个或最后一个子元素?
- jquery如何获取第一个或最后一个子元素?
- firstChild,lastChild 获取第一个/最后一个元素节点
- 查找第一个与最后一个key值位置
- 二分查找最后一个小于等于和第一个大于等于某对象的数组元素位置
- 二分查找 —— 有序数组不小于(不大于)某数的第一个(最后一个)元素
- 第一个和最后一个
- STM32--UART异步通信学习
- 用最小代价实现双电源供电自动切换
- centos 6.2 安装mysql-5.5.17
- STM32通用定时器---基本定时学习
- [Leetcode] Integer to Roman (Java)
- 递归折半查找多个相同元素中的第一个或者最后一个
- Solr Cookbook学习记录 - 第6,8,9章
- [学习笔记] C++ 初体验
- node 调试脚本
- 一个基于RSA算法的Java数字签名例子
- RHEL 5基础篇—Linux常用命令参考手册
- KVC (Key-Value Coding)
- STM32单片机学习---PWM输出
- 欢迎大家关注我的微信帐号!