生活随笔
收集整理的這篇文章主要介紹了
二分查找和二分排序
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
二分查找又稱折半查找
憑借一句話獲得圖靈獎的Pascal之父——Nicklaus Wirth(一個很牛逼的人)
讓他獲得圖靈獎的這句話就是他提出的著名公式:
“算法+數(shù)據(jù)結(jié)構(gòu)=程序”。
這個公式對計算機科學的影響程度足以類似物理學中愛因斯坦的“E=MC^2”——一個公式展示出了程序的本質(zhì)。
,優(yōu)點是比較次數(shù)少,查找速度快,平均性能好;其缺點是要求待查表為有序表,且插入刪除困難
算法要求
1. 必須采用順序存儲結(jié)構(gòu)
2. 必須按關鍵字大小有序排列。
算法分析
時間復雜度可以表示O()=O(logn)
它充分利用了元素間的次序關系,采用分治策略,可在最壞的情況下用O(log n)完成搜索任務
#include <iostream>using namespace std;
void SelectSort(
int a[],
int n)
{
for(
int i=
0; i<n; i++) {
int min=a[i];
int index=i;
for(
int j=i+
1; j<n; j++) {
if(a[j]<min){min=a[j];index=j;}}
int temp=a[index];a[index]=a[i];a[i]=temp;}
for(
int i=
0; i<n; i++){
cout<<a[i]<<
" ";}
}
int BinarySearch(
int s[],
int x,
int n)
{
if(s==NULL||n<
0){
return -
1;}
int low=
0;
int high=n-
1;
while (low<=high){
int middle=(low+high)/
2;
if(x==s[middle]){
return middle;}
else if(x>s[middle]){low=middle+
1;}
else{high=middle-
1;}}
return -
1;
}
while(x<=y) {m = x + (y-x)/
2;
if(data[m] == v)
return m;
else if(data[m] > v) y = m-
1;
else x = m+
1; }補充:x<y這里下標是個坑,記住上限有沒有包含,然后是
2,寫成x+(y-x)/
2是防止xy都很大的情況下x+y越界。這樣的話應對二分查找應該夠了
int nBinarySearch(
int s[],
int x,
int low,
int high)
{
if(low>high)
return -
1;
int middle=(low+high)/
2;
if(x==s[middle])
return middle;
else if(x>s[middle]){
return nBinarySearch(s,x,middle+
1,high);}
else{
return nBinarySearch(s,x,low,middle-
1);}
}
int main()
{
int s[
11]= {
6,
15,
12,
22,
18,
28,
25,
60,
58,
46,
35};
int n=
sizeof(s)/
sizeof(
int);
cout<<endl;SelectSort(s,n);
cout<<
"index:"<<BinarySearch(s,
12,
0,n-
1);
cout<<endl;
cout<<
"index:"<<nBinarySearch(s,
12,
0,n-
1);
return 0;
}
二分排序(折半插入排序)
二分排序就是折半插入排序,當直接插入排序進行到某一趟時,對于前面記錄已經(jīng)按關鍵字有序,此時不用直接插入排序的方法,而用折半二分查找,找出下一個元素應插入的位置,然后插入,這種方法就是折半插入排序,這種方法中比較次數(shù),由于采用折半查而減少,為O(nlogn),但是元素交換的次數(shù)仍為O(n2),二分排序算法是穩(wěn)定的。
#include <iostream>using namespace std;
void binary_sort(
int a[],
int n);
int main()
{
int a[]= {
3,
41,
369,
1,
2,
4,
5,
9};
int n=
8;binary_sort(a,n);
for(
int i=
0; i<n; i++){
cout<<a[i]<<
" ";}
return 0;
}
void binary_sort(
int a[],
int n)
{
int low ,high, mid;
int tem;
for(
int i=
1; i<n; i++){tem=a[i];low=
0;high=i-
1;
while(low<=high){mid=(low+high)/
2;
if(a[mid]>tem){high=mid-
1;}
else{low=mid+
1;}}
for(
int j=i-
1; j>high; j--){a[j+
1]=a[j];}a[high+
1]=tem;}
}
總結(jié)
以上是生活随笔為你收集整理的二分查找和二分排序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。