資料結構和演算法 第八章查詢演算法

2021-10-19 16:18:13 字數 2863 閱讀 9267

三、二分查詢演算法

四、插值查詢演算法

五、斐波那契查詢演算法

總結資料結構和演算法-查詢演算法

(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 ...