二分查找和快速排序
一、二分查找
二分查找的基本思想:
? 二分查找就是給定一個(gè)已經(jīng)排序好的數(shù)組,輸入你想查找的數(shù)值,然后對數(shù)組進(jìn)行折半查找,找到直接返回在數(shù)組中的位置,否則返回-1。它充分利用了元素間的次序關(guān)系,采用分治策略,可在最壞的情況下用O(log n)完成搜索任務(wù)。
具體實(shí)現(xiàn):
1、binarySearch函數(shù)傳入已經(jīng)排序好的數(shù)組(nums[]),你想查找的目標(biāo)數(shù)值(target),數(shù)組的長度(length)
2、binarySearch中先設(shè)置數(shù)組的左右邊界left、right,然后求解數(shù)組的中間位置mid,判斷其與目標(biāo)數(shù)值的大小,如果中間位置的數(shù)值剛好等于目標(biāo)數(shù)值,則直接返回mid。如果中間數(shù)值小于目標(biāo)數(shù)值,說明目標(biāo)數(shù)值在中間位置后方重置left=mid+1,反之目標(biāo)數(shù)值就是在中間位置的前方重置right=mid-1。直到查找到目標(biāo)數(shù)值并且返回目標(biāo)數(shù)值在數(shù)組中的位置。
二分查找算法的時(shí)間復(fù)雜度分析:
時(shí)間復(fù)雜度即是while循環(huán)的次數(shù)。總共有n個(gè)元素,漸漸跟下去就是n,n/2,n/4,…n/2k(接下來操作元素的剩余個(gè)數(shù)),其中k就是循環(huán)的次數(shù)由于你n/2k取整后>=1,即令n/2^k=1,可得k=log2n,(是以2為底,n的對數(shù))。所以時(shí)間復(fù)雜度可以表示O(h)=O(log2n)=O(log n)。
O(log2n)是以2為底數(shù),n為對數(shù)的對數(shù)函數(shù),O(log n)同理只不過底數(shù)2省略了
//二分查找:對有順序的數(shù)組中特定元素進(jìn)行的快速查找的算法 。 #include<stdio.h>int binarySearch(int nums[],int target,int length);int main(){int i,n,target;scanf("%d %d",&n,&target);int a[n];for(i=0;i<n;i++){scanf("%d",&a[i]);}printf("%d",binarySearch(a,target,n));return 0; }int binarySearch(int nums[], int target,int length) {//設(shè)置左右邊界int left = 0; int right = length - 1; while(left <= right) { //計(jì)算數(shù)組的中間位置midint mid = (right + left) / 2; if(nums[mid] == target) //如果中間位置找到直接返回return mid; else if (nums[mid] < target)//如果中間位置的數(shù)值小于目標(biāo)數(shù)值,說明目標(biāo)數(shù)值在數(shù)組的右邊left = mid + 1; else if (nums[mid] > target)//如果中間位置的數(shù)值大于目標(biāo)數(shù)值,說明目標(biāo)數(shù)值在數(shù)組的左邊right = mid - 1; }return -1; }二、快速排序
快速排序的基本思想:
快速排序的時(shí)間復(fù)雜度分析:
快速排序的一次劃分算法從兩頭交替搜索,直到low和hight重合,因此其時(shí)間復(fù)雜度是O(n);而整個(gè)快速排序算法的時(shí)間復(fù)雜度與劃分的趟數(shù)有關(guān)。 [4]
理想的情況是,每次劃分所選擇的中間數(shù)恰好將當(dāng)前序列幾乎等分,經(jīng)過log2n趟劃分,便可得到長度為1的子表。這樣,整個(gè)算法的時(shí)間復(fù)雜度為O(nlog2n)。 [4]
最壞的情況是,每次所選的中間數(shù)是當(dāng)前序列中的最大或最小元素,這使得每次劃分所得的子表中一個(gè)為空表,另一子表的長度為原表的長度-1。這樣,長度為n的數(shù)據(jù)表的快速排序需要經(jīng)過n趟劃分,使得整個(gè)排序算法的時(shí)間復(fù)雜度為O(n2)。 [4]
為改善最壞情況下的時(shí)間性能,可采用其他方法選取中間數(shù)。通常采用“三者值取中”方法,即比較H->r[low].key、H->r[high].key與H->r[(low+high)/2].key,取三者中關(guān)鍵字為中值的元素為中間數(shù)。 [4]
可以證明,快速排序的平均時(shí)間復(fù)雜度也是O(nlog2n)。因此,該排序方法被認(rèn)為是目前最好的一種內(nèi)部排序方法。
快速排序的時(shí)間復(fù)雜度分析引用于百度百科
百度百科-快速排序算法
快速排序還有很多改進(jìn)版本,如隨機(jī)選擇基準(zhǔn)數(shù),區(qū)間內(nèi)數(shù)據(jù)較少時(shí)直接用另的方法排序以減小遞歸深度 。
總結(jié)
- 上一篇: docker 安装ELK
- 下一篇: 改进的二分查找