生活随笔
收集整理的這篇文章主要介紹了
二分排序算法
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
整數(shù)二分排序算法:
什么時候會選擇用到?——給定一個按照升序排列的長度為n的整數(shù)數(shù)組
二分程序雖然簡單,但是如果寫之前不考慮好想要查找的是什么,十有八九會是死循環(huán)或者查找錯誤,就算僥幸寫對了也只是運(yùn)氣好而已。
用二分去查找元素要求數(shù)組的有序性或者擁有類似于有序的性質(zhì)
模板代碼:
bool check(int x
) {}
int bsearch_1(int l
, int r
)
{while (l
< r
){int mid
= l
+ r
>> 1;if (check(mid
)) r
= mid
; else l
= mid
+ 1;}return l
;
}
int bsearch_2(int l
, int r
)
{while (l
< r
){int mid
= l
+ r
+ 1 >> 1;if (check(mid
)) l
= mid
;else r
= mid
- 1;}return l
;
}
int l
= 0, r
= n
- 1;
while (l
< r
) {int mid
= l
+ r
>> 1;if (a
[mid
] < x
) l
= mid
+ 1;else r
= mid
;
}
int l1
= l
, r1
= n
;
while (l1
+ 1 < r1
) {int mid
= l1
+ r1
>> 1;if (a
[mid
] <= x
) l1
= mid
;else r1
= mid
;
}
實(shí)戰(zhàn)代碼:
#include <iostream>
using namespace std
;
const int N
= 1e6+10;
int n
,m
;
int q
[N
];
int main()
{scanf("%d%d",&n
,&m
);for(int i
=0;i
<n
;i
++) scanf("%d",&q
[i
]);while(m
--) {int x
;scanf("%d",&x
);int l
=0,r
=n
-1;while(l
<r
){int mid
= l
+r
>> 1;if(q
[mid
]>=x
) r
=mid
;else l
= mid
+1;}if(q
[l
]!=x
) cout
<< "-1 -1" << endl
;else {cout
<< l
<< ' ';int l
=0,r
=n
-1;while(l
<r
){int mid
= l
+r
+1 >> 1;if(q
[mid
]<=x
) l
=mid
;else r
=mid
-1;}cout
<< l
<< endl
; }}return 0;
}
浮點(diǎn)數(shù)二分代碼模板:
bool check(double x
) {} double bsearch_3(double l
, double r
)
{const double eps
= 1e-6; while (r
- l
> eps
){double mid
= (l
+ r
) / 2;if (check(mid
)) r
= mid
;else l
= mid
;}return l
;
}
實(shí)戰(zhàn)代碼
#include<iostream>
using namespace std
;
int main()
{double x
;cin
>> x
;double l
= -10000,r
=10000;while(r
- l
> 1e-8){double mid
= (l
+ r
) / 2;if(mid
* mid
* mid
>= x
) r
= mid
;else l
= mid
;}printf("%lf", l
);return 0;
}
總結(jié)
以上是生活随笔為你收集整理的二分排序算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。