C++二分法查找数组

  1. 新建一个数组,如下:

Arry[] = { 3, 2, 4, 15,25,10,7, 9, 11, 456, 5, 34,55,8, 12, 666  }

  1. 利用对象的概念完成相应功能,将数组的内容进行排序输出 
  2. 在主函数中进行操作,从键盘中输入任何一个数字,如果数字是数组内的成员,则报出该数字在新数组阵列中的位置,如果不是该数组内的成员,给出相应的提示。
  3. 利用对象的概念完成相应功能,查找数字要求用二分法进行查找 
  4. 写出完整代码

二分查找必须是有序序列.


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