三、二分查詢演算法
四、插值查詢演算法
五、斐波那契查詢演算法
總結資料結構和演算法-查詢演算法
(1)順序(線性)查詢
按照順序比對,找到我們需要的資料
(2)二分查詢/折半查詢
(3)插值查詢
(4)斐波那契查詢(**分割查詢)
線性查詢是逐一比對,發現有相同值,就返回下標
//線性查詢
public static
intseqsearch
(int
arr,
int value)
}return-1
;}```c
使用二分查詢演算法的前提是該陣列是有序的
//二分查詢
public static
intbinarysearch
(int
arr,
int left,
int right,
int findval)
int mid=
(left+right)/2
;if(findval>arr[mid]
)else
if(findval
)else
}/**
*陣列中有多個相同的數值時,將所有資料都找到
* 思路分析:
* 1,在找到mid索引值後,不要馬上返回
* 2,向mid索引值的左邊掃瞄,將所有滿足相同的元素索引,加入到集合arraylist
* 3,向mid索引值的右邊掃瞄,將所有滿足相同的元素的索引,加入到集合arraylist
* 4,將arraylist返回
*/public static list
binarysearch2
(int
arr,
int left,
int right,
int findval)
int mid=
(left+right)/2
;if(findval>arr[mid]
)else
if(findval
)else
resindexlist.
add(temp)
; temp-=1
;//temp左移
}//1中間
resindexlist.
add(mid)
;//3*右邊
temp=mid+1;
while
(true)
resindexlist.
add(temp)
; temp+=1
;//temp右移
}//找到該值
return resindexlist;}}
```c
對二分查詢的優化,將mid改為–>自適應mid
當資料量較大時,並且資料之間跳躍性不大時(關鍵字分布比較均勻),採用插值查詢, 速度較快,mid自適應
mid=left+(right-left) * (findval-arr[left]) / (arr[right]-arr[left])
public static
intinsertvaluesearch
(int
arr,
int left,
int right,
int findval)
int mid=left+
(findval-arr[left])*
(right-left)
/(arr[right]
-arr[left]);
if(findval>arr[mid]
)else
if(findval
)else
}```c
**分割:是指將整體一分為二,較大部分與整體部分的比值等於較小部分與較大部分的比值,其比值約為0.618
fibonaccisearch:借助乙個斐波那契數列來配合我們這個陣列來找**分割點
low,high相當於指標
//因為後面mid=low+f(k-1)-1,需要使用到斐波那契數列,因此我們需要先獲取到乙個斐波那契數列
public static
int[
]fib()
return f;
}/**
* 斐波那契查詢演算法,使用非遞迴方式
* 1,temp = =>
* 2,使用 while 來迴圈處理,找到我們的數 key
*/public static
intfibsearch
(int
arr,
int key)
//由於f[k]的值可能大於arr的長度,所以要將陣列擴容
int[
] temp = arrays.
copyof
(arr, f[k]);
//將陣列後面擴容的數置為high
for(
int i = high +
1; i < temp.length; i++
)//使用while來迴圈處理,找到我們的數key
while
(low <= high)
else
if(key > temp[mid]
)else
else}}
return-1
;}```c
資料結構 第八章 查詢目錄
資料表 資料元素的有限集合。關鍵字 資料表中資料元素一般有多個屬性域 字段 即由多個資料成員組成,其中有某些屬性域可用來區分不同的元素,它們可作為查詢或排序的依據,這些屬性域即為關鍵字。即使是同乙個表,在解決不同問題的場合也可能取不同的域作關鍵字。如果在資料表中各個元素的關鍵字互不相同,這種關鍵字稱...
第八章 高效演算法設計
分治法求最大連續和 注意範圍是 x,y includeusing namespace std int maxsum int a,int x,int y int main 3 1 0 1 2 int t 100 k 0 printf d n quicksort a,0,4 return 0 二分查詢折...
第八章 排序演算法總結
第八章 排序 一 插入類排序 1 直接插入排序 void insertsort int r,int n t next null 排序函式 void sort lnode h p1 p next p next pre next pre next p p p1 2 折半插入排序 折半插入排序 void ...