日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

二分查找和二分排序

發(fā)布時間:2023/12/9 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二分查找和二分排序 小編覺得挺不錯的,現(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++) //外層循環(huán){int min=a[i];//每次循環(huán)把a[i]假設當前最小的數(shù)int index=i;//相當一個索引,始終指向最小的for(int j=i+1; j<n; j++) //內(nèi)層循環(huán),從剩下的數(shù)中找有沒有更小的{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) {//如果傳入的數(shù)組為空或者數(shù)組長度<=0那么就返回-1。防御性編程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; //2if(data[m] == v) return m; //3else if(data[m] > v) y = m-1; //4else x = m+1; //5}補充: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)容還不錯,歡迎將生活随笔推薦給好友。