基于JavaScript實(shí)現(xiàn)的順序查找算法示例
本文實(shí)例講述了基于JavaScript實(shí)現(xiàn)的順序查找算法。分享給大家供大家參考,具體如下:
對(duì)于查找數(shù)據(jù)來(lái)說(shuō),最簡(jiǎn)單的方法就是從列表的第一個(gè)元素開(kāi)始對(duì)列表元素逐個(gè)進(jìn)行判斷,直到找到了想要的結(jié)果。這個(gè)方法叫做順序查找,有時(shí)候也被叫做線(xiàn)性查找。它屬于暴力查找技巧的一種。
順序查找實(shí)現(xiàn)起來(lái)非常簡(jiǎn)單,代碼如下:
function generalSearch(arr,data){//普通的順序查找,就是遍歷一遍看是否找到
for(var i=0;i<arr.length;i++){
if(arr[i]==data){
return true;
}
}
return false;
}
那么這樣會(huì)不會(huì)效率很低呢?對(duì)于未排序的數(shù)據(jù)集來(lái)說(shuō),當(dāng)被查到的數(shù)據(jù)位于數(shù)據(jù)集的起始位置時(shí),查找是最快、最成功的。通過(guò)將成功找到的元素置于數(shù)據(jù)集的起始位置,可以保證在以后的操作中元素能被更快的查找到,代碼如下:
function betterSearch(arr,data){//自組織查找,將查找率高的依次往前移
for(var i=0;i<arr.length;i++){
if(arr[i]==data){
if(i>0){
swap(arr,i,i-1);//如果找到則將查找的值和前一個(gè)值交換位置
}
return true;
}
}
return false;
}
function swap(arr,i,j){//交換位置
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
那有沒(méi)有更加好的方法呢?在查找的世界中,有一個(gè)“80-20原則”,指的是對(duì)某一數(shù)據(jù)集執(zhí)行的80%的查找操作都是對(duì)其中20%的數(shù)據(jù)元素進(jìn)行查找。所以我們可以將查找到且處于后80%的元素放在起始位置,而前20%則不需要改變,代碼如下:
function bestSearch(arr,data){//更好的自組織查找,將排名后80%的查找結(jié)果調(diào)到第一位
for(var i=0;i<arr.length;i++){
if(arr[i]==data&&i>(arr.length*0.2)){//如果是后80%
swap(arr,i,0);
return true;
}else if(arr[i]==data){
return true;//前20%就不移動(dòng)了
}
}
return false;
}
三種查找的實(shí)驗(yàn)代碼如下:
//進(jìn)行試驗(yàn)
var nums=[3,1,4,6,2,9,8,0,5,7];
//普通查找
var bool=generalSearch(nums,3);
document.write(bool+'<br>');//true
var bool=generalSearch(nums,11);
document.write(bool+'<br>');//false
//自組織查找
showNums(nums);//3 1 4 6 2 9 8 0 5 7
betterSearch(nums,2);
showNums(nums);//3 1 4 2 6 9 8 0 5 7
betterSearch(nums,2);
showNums(nums);//3 1 2 4 6 9 8 0 5 7
betterSearch(nums,2);
showNums(nums);//3 2 1 4 6 9 8 0 5 7
//更好的自組織查找
document.write("更好的自組織查找<br>");
bestSearch(nums,5);
showNums(nums);//5 2 1 4 6 9 8 0 3 7
bestSearch(nums,2);
showNums(nums);//5 2 1 4 6 9 8 0 3 7
順序查找的完整代碼:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script type="text/javascript">
function generalSearch(arr,data){//普通的順序查找,就是遍歷一遍看是否找到
for(var i=0;i<arr.length;i++){
if(arr[i]==data){
return true;
}
}
return false;
}
function betterSearch(arr,data){//自組織查找,將查找率高的依次往前移
for(var i=0;i<arr.length;i++){
if(arr[i]==data){
if(i>0){
swap(arr,i,i-1);//如果找到則將查找的值和前一個(gè)值交換位置
}
return true;
}
}
return false;
}
function swap(arr,i,j){//交換位置
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
function bestSearch(arr,data){//更好的自組織查找,將排名后80%的查找結(jié)果調(diào)到第一位
for(var i=0;i<arr.length;i++){
if(arr[i]==data&&i>(arr.length*0.2)){//如果是后80%
swap(arr,i,0);
return true;
}else if(arr[i]==data){
return true;//前20%就不移動(dòng)了
}
}
return false;
}
function showNums(arr){
for(var i=0;i<arr.length;i++){
document.write(arr[i]+' ');
}
document.write("<br>");
}
//進(jìn)行試驗(yàn)
var nums=[3,1,4,6,2,9,8,0,5,7];
//普通查找
var bool=generalSearch(nums,3);
document.write(bool+'<br>');//true
var bool=generalSearch(nums,11);
document.write(bool+'<br>');//false
//自組織查找
showNums(nums);//3 1 4 6 2 9 8 0 5 7
betterSearch(nums,2);
showNums(nums);//3 1 4 2 6 9 8 0 5 7
betterSearch(nums,2);
showNums(nums);//3 1 2 4 6 9 8 0 5 7
betterSearch(nums,2);
showNums(nums);//3 2 1 4 6 9 8 0 5 7
//更好的自組織查找
document.write("更好的自組織查找<br>");
bestSearch(nums,5);
showNums(nums);//5 2 1 4 6 9 8 0 3 7
bestSearch(nums,2);
showNums(nums);//5 2 1 4 6 9 8 0 3 7
</script>
</body>
</html>
運(yùn)行效果如下圖:

更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》、《JavaScript排序算法總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》、《JavaScript查找算法技巧總結(jié)》及《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
相關(guān)文章
BootStrap智能表單實(shí)戰(zhàn)系列(三)分塊表單配置詳解
這篇文章主要介紹了BootStrap智能表單實(shí)戰(zhàn)系列(三)分塊表單配置詳解的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06
微信JS-SDK實(shí)現(xiàn)微信會(huì)員卡功能(給用戶(hù)微信卡包里發(fā)送會(huì)員卡)
這篇文章主要介紹了微信JS-SDK實(shí)現(xiàn)微信會(huì)員卡功能(給用戶(hù)微信卡包里發(fā)送會(huì)員卡),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
javascript設(shè)計(jì)模式 – 中介者模式原理與用法實(shí)例分析
這篇文章主要介紹了javascript設(shè)計(jì)模式 – 中介者模式,結(jié)合實(shí)例形式分析了javascript中介者模式基本概念、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下2020-04-04
javascript實(shí)現(xiàn)點(diǎn)擊小圖顯示大圖
這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)點(diǎn)擊小圖顯示大圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11
Bootstrap教程JS插件滾動(dòng)監(jiān)聽(tīng)學(xué)習(xí)筆記分享
這篇文章主要為大家分享了Bootstrap教程JS插件滾動(dòng)監(jiān)聽(tīng)學(xué)習(xí)筆記,內(nèi)容很詳細(xì),感興趣的小伙伴們可以參考一下2016-05-05
js實(shí)現(xiàn)簡(jiǎn)單鎖屏功能實(shí)例
這篇文章主要介紹了js實(shí)現(xiàn)簡(jiǎn)單鎖屏功能的方法,實(shí)例分析了javascript操作頁(yè)面元素顯示與隱藏的相關(guān)技巧,涉及javascript操作元素屬性與鼠標(biāo)、鍵盤(pán)事件的相關(guān)技巧,需要的朋友可以參考下2015-05-05
js實(shí)現(xiàn)PC端根據(jù)IP定位當(dāng)前城市地理位置
本文主要分享了js實(shí)現(xiàn)PC端根據(jù)IP定位當(dāng)前城市地理位置的方法,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-02-02

