二分查詢和快速排序

2021-10-24 15:13:33 字數 2455 閱讀 9301

二分查詢的基本思想:

​ 二分查詢就是給定乙個已經排序好的陣列,輸入你想查詢的數值,然後對陣列進行折半查詢,找到直接返回在陣列中的位置,否則返回-1。它充分利用了元素間的次序關係,採用分治策略,可在最壞的情況下用o(log n)完成搜尋任務。

具體實現:

1、binarysearch函式傳入已經排序好的陣列(nums),你想查詢的目標數值(target),陣列的長度(length)

2、binarysearch中先設定陣列的左右邊界left、right,然後求解陣列的中間位置mid,判斷其與目標數值的大小,如果中間位置的數值剛好等於目標數值,則直接返回mid。如果中間數值小於目標數值,說明目標數值在中間位置後方重置left=mid+1,反之目標數值就是在中間位置的前方重置right=mid-1。直到查詢到目標數值並且返回目標數值在陣列中的位置。

二分查詢演算法的時間複雜度分析:

時間複雜度即是while迴圈的次數。總共有n個元素,漸漸跟下去就是n,n/2,n/4,…n/2k(接下來操作元素的剩餘個數),其中k就是迴圈的次數由於你n/2k取整後》=1,即令n/2^k=1,可得k=log2n,(是以2為底,n的對數)。所以時間複雜度可以表示o(h)=o(log2n)=o(log n)。

o(log2n)是以2為底數,n為對數的對數函式,o(log n)同理只不過底數2省略了

//二分查詢:對有順序的陣列中特定元素進行的快速查詢的演算法 。 

#include

intbinarysearch

(int nums,

int target,

int length)

;int

main()

printf

("%d"

,binarysearch

(a,target,n));

return0;

}int

binarysearch

(int nums,

int target,

int length)

return-1

;}

快速排序的基本思想:

先從給定的陣列中取出乙個基準數

劃分過程,小於等於基準數的放在左邊,大於基準數的放在右邊

再對左右區間重複第2步操作,直到各區間只有乙個數

快速排序的時間複雜度分析:

快速排序的一次劃分演算法從兩頭交替搜尋,直到low和hight重合,因此其時間複雜度是o(n);而整個快速排序演算法的時間複雜度與劃分的趟數有關。 [4]

理想的情況是,每次劃分所選擇的中間數恰好將當前序列幾乎等分,經過log2n趟劃分,便可得到長度為1的子表。這樣,整個演算法的時間複雜度為o(nlog2n)。 [4]

最壞的情況是,每次所選的中間數是當前序列中的最大或最小元素,這使得每次劃分所得的子表中乙個為空表,另一子表的長度為原表的長度-1。這樣,長度為n的資料表的快速排序需要經過n趟劃分,使得整個排序演算法的時間複雜度為o(n2)。 [4]

為改善最壞情況下的時間效能,可採用其他方法選取中間數。通常採用「三者值取中」方法,即比較h->r[low].key、h->r[high].key與h->r[(low+high)/2].key,取三者中關鍵字為中值的元素為中間數。 [4]

可以證明,快速排序的平均時間複雜度也是o(nlog2n)。因此,該排序方法被認為是目前最好的一種內部排序方法。

//快速排序:不斷的劃分左右兩邊的數值 ,以乙個數為基準左邊的數永遠小於右邊的數。最後的劃分都是對兩個數值的比較。 

#include

void

quicksort

(int a,

int p,

int r)

;//分治**

intpartition

(int a,

int p,

int r)

;//填坑**

intmain()

quicksort

(a,0

,n-1);

for(i=

0;i)return0;

}void

quicksort

(int a,

int p,

int r)

}//對a的陣列從p到r以a[p]為基準進行分割,左邊永遠比a[p]小,右邊永遠比a[p]大。

intpartition

(int a,

int p,

int r)

a[p]

=a[j]

; a[j]

=x;return j;

}

快速排序還有很多改進版本,如隨機選擇基準數,區間內資料較少時直接用另的方法排序以減小遞迴深度 。

二分查詢和快速排序

快排的中心思想,就是選取乙個元素通過一趟排序將比這個元素大的換到前面,把這個元素小的換到後面。然後在繼續進行排序。void sort int datas,int low,int high int first low int last high int key datas first while fi...

快速排序 二分查詢

1.舉例說明一下吧,這個可能不是太好理解。假設要排序的序列為 2 4 9 3 6 7 1 5 首先用2當作基準,使用i j兩個指標分別從兩邊進行掃瞄,把比2小的元素和比2大的元素分開。首先比較2和5,5比2大,j左移 2 4 9 3 6 7 1 5 比較2和1,1小於2,所以把1放在2的位置 1 4...

快速排序 二分查詢

基準數後面的數需要大於基準數,從後向前尋找a j tmp,尋找到a 8 的3 5,將a 8 放入空位a 0 中,a j a 8 此時空出位置 接著從前向後遍歷a i 5,找到a 1 符合條件,將a 1 放入空位a 8 a 1 空出 繼續從後向前尋找 繼續從後向前尋找 遍歷至i j 結束,此時i前邊元...