Arry[] = { 3, 2, 4, 15,25,10,7, 9, 11, 456, 5, 34,55,8, 12, 666 }
二分查找必须是有序序列.
public class QuickSort {
int a[];
public QuickSort() {
a = new int[]{8,19,2,3,100,99,1000,888,-1,0};
}
public QuickSort(int a[]) {
this.a = a;
}
//分区:i是左边界,j是右边界
int partition(int a[],int i,int j,int size){
//把小于m的放在m的左边,大于等于m的放在m的右边
int m=a[i];
while(i<j){
//从右往左,查找小于m的元素
while(i<j && a[j]>=m){
j--;
}
if(i<j){
a[i++]=a[j];
}
//从左往右,查找大于m的元素
while(i<j && a[i]<m){
i++;
}
if(i<j){
a[j--]=a[i];
}
}
a[i]=m;
// print();
return i;
}
//排序
public void quickSort(int a[],int left,int right,int size){
if(left<right){
int pos = partition(a, left, right, size);
//左边区块
quickSort(a, left, pos-1, size); //调用很多次
quickSort(a, pos+1,right, size);//调用很多次
}
// else{
// System.out.println("排序结束");
// }
}
public void print(){
for (int e : a) {
System.out.print(e+"\t");
}
System.out.println("");
}
public static void main(String[] args) {
/*8,19,2,3,100,99,1000,888,-1,0
* m=a[0]=8
* i=0,j=9
* 从右往左:m=a[0]=8,i=0,j=9 a[j]=a[9]=0<m
* 0,19,2,3,100,99,1000,888,-1,0 m=8,i=1,j=9
* 0,19,2,3,100,99,1000,888,-1,19 m=8,i=1,j=8
* 0,-1,2,3,100,99,1000,888,-1,19 m=8,i=2,j=8
* 0,-1,2,3,100,99,1000,888,100,19 m=8,i=4,j=7
* 0,-1,2,3,100,99,1000,888,100,19 m=8,i=4,j=4
* 0,-1,2,3,8,99,1000,888,100,19
*/
QuickSort sort = new QuickSort();
System.out.println("排序前数据顺序:");
sort.print();
long start = System.currentTimeMillis();
sort.quickSort(sort.a, 0, sort.a.length-1, sort.a.length);
sort.print();
long end = System.currentTimeMillis()-start;
System.out.println("排序用时:"+end +"毫秒");
}
}
先冒泡排序,再二分查找,定义一个类,Arry是成员变量,冒泡为私有函数,二分查找为公有函数
class Soulation{
private:
int *m_pVal;
int m_nValNum;
void SortNum()
{
for (int i = 0; i < m_nValNum - 1; i++) {
for (int j = 0; j<m_nValNum - 1 - i; j++)
{
if (m_pVal[j]>m_pVal[j + 1]) { //比较相邻的两个元素
int tmp; //临时变量
tmp = m_pVal[j]; //交换
m_pVal[j] = m_pVal[j + 1];
m_pVal[j + 1] = tmp;
}
}
}
}
public:
Soulation()
{
m_pVal = NULL;
m_nValNum = 0;
}
Soulation(int *pVal, int nValNum)
{
m_pVal = pVal;
m_nValNum = nValNum;
SortNum();
for (int i = 0; i < nValNum; i++)
printf("%d ", m_pVal[i]);
}
int BSearch(int nNum)
{
int low = 0, high = m_nValNum;
int mid;
while (low<high)
{
mid = (low + high) / 2;
if (nNum > m_pVal[mid])
{
low = mid + 1;
continue;
}
else if (nNum < m_pVal[mid])
{
high = mid;
continue;
}
if (nNum == m_pVal[mid])
return mid;
break;
}
return -1;
}
};
int main()
{
int Arry[] = { 3, 2, 4, 15, 25, 10, 7, 9, 11, 456, 5, 34, 55, 8, 12, 666 };
Soulation s(Arry, sizeof(Arry) / sizeof(int));
int nIdx = s.BSearch(456);
printf("%d\n", nIdx);
return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632
希望对您有帮助,盼采纳:https://blog.csdn.net/it_xiangqiang/category_10581430.html
非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!
速戳参与调研>>>https://t.csdnimg.cn/Kf0y