数据结构与算法(8-2)有序表查找(折半查找(二分查找)、插值查找)
生活随笔
收集整理的這篇文章主要介紹了
数据结构与算法(8-2)有序表查找(折半查找(二分查找)、插值查找)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
目錄
一、折半查找(二分查找)
二、插值查找
總代碼
一、折半查找(二分查找)
原理:一次次折半,不斷向著查找值的位置靠近 。
適用場景:有序(必須)
流程:開始時,min標(biāo)志首,max標(biāo)志尾,medium=(min+max)/2。然后即可開始查找,判斷str[medium]和要查找的值是否相等:1、相等:min = medium+1 ????????2、不相等:max=medium-1? 。
?
?
//折半查找(注:前提是有序序列)
int Binary_Search(char ch)
{int min = 0, max = strlen(str)-1;int medium;while (min <= max){medium = (max + min) / 2; //取中值if (ch == str[medium])return medium;else if (ch > str[medium])min = medium+1; //進(jìn)入右半邊(medium位置已查找過,跳過)elsemax = medium-1; //進(jìn)入左半邊(medium位置已查找過,跳過)}return -1;
}
二、插值查找
按比例查找到最接近的位置。選取一段的比例(如:(min+小半段)*總),有序且數(shù)據(jù)分布均勻時,可以更快的定位。
適用場景:有序(必須),數(shù)值分布均勻,線性增長。
//插值查找(比例查找)
int Insert_Search(char ch)
{int medium, min = 0, max = strlen(str) - 1;while (min <= max){//取比例medium = min + (ch - str[min]) / (str[max] - str[min]) * (max - min); if (ch == str[medium])return medium;else if (ch > str[medium])min = medium + 1; //進(jìn)入右半邊(medium位置已查找過,跳過)elsemax = medium - 1; //進(jìn)入左半邊(medium位置已查找過,跳過)}return -1;
}
總代碼
//有序表查找(折半查找、插值查找)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string>char str[20];//輸入
char Input()
{char ch = ' ';printf("請輸入一串?dāng)?shù)組:\n");for (int i = 0; i < 20 && ch != '\n'; i++){scanf("%c", &ch);str[i] = ch;}printf("請輸入您想要查找的字符:");scanf("%c", &ch);return ch;
}//折半查找(注:前提是有序序列)
int Binary_Search(char key)
{int min = 0, max = strlen(str)-1, mid;while (min <= max){mid = (max + min) / 2; //取中值if (key == str[mid])return mid;else if (key > str[mid])min = mid+1; //進(jìn)入右半邊(mid位置已查找過,跳過)elsemax = mid-1; //進(jìn)入左半邊(mid位置已查找過,跳過)}return -1;
}//插值查找(比例查找)
int Insert_Search(char key)
{int mid, min = 0, max = strlen(str) - 1;while (min <= max){//取比例mid = min + (key - str[min]) / (str[max] - str[min]) * (max - min);if (key == str[mid])return mid;else if (key > str[mid])min = mid + 1; //進(jìn)入右半邊(mid位置已查找過,跳過)elsemax = mid - 1; //進(jìn)入左半邊(mid位置已查找過,跳過)}return -1;
}int main()
{char ch;ch = Input(); //輸入printf("折半查找(二分查找)結(jié)果: %d\n", Binary_Search(ch)); //折半查找printf("插值查找結(jié)果:%d\n", Insert_Search(ch)); //插值查找return 0;
}
總結(jié)
以上是生活随笔為你收集整理的数据结构与算法(8-2)有序表查找(折半查找(二分查找)、插值查找)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV(十)ROI感兴趣区域
- 下一篇: OpenCV(十二)漫水填充算法