JavaSE入门:JavaSE——冒泡排序,选择排序,二分法查询

引入:交换两个变量的值

  • 中间变量(开发常用)
		int a=1;
		int b=2;
		int temp=a;
		a=b;
		b=temp;
  • 位移运算交换(面试常用)
		int a=1;
		int b=2;
		a=a^b;
		b=a^b;
		a=a^b;
  • 加和运算
		int a=1;
		int b=2;
		a=a+b;
		b=a-b;
		a=a-b;

冒泡排序

概念:
1 比较相邻的两个元素,如果第一个比第二大就交换位置
2 对每一对相邻的元素做相同的工作,从第一对一直比较到最后一对,比较一轮结束后,最后一个元素一定是最大的
3 针对所有元素,重复上面的步骤,除了最后一个元素
4 持续循环中,比较次数越来越少,一直剩下一个数据(没有一对了,只有一个了),比较结束
无基点,都是流动的 每一轮都会有 一个相对最大的数流动到右边,就是相当于,从大数开始放置,一直到最小的数

//		外层循环   判定从前往后比较完为一轮 需要几轮
		//		相当于拿起第i个数去比较(靠内层去比较一轮),总共a.length个数,比较a.length-1个数,剩下的自然就是最小的
		for(int i=1;i<a.length-1;i++) {
//			System.out.println(i);
//			内层循环  判定不同轮次里需要比较几次
		//			以下标进行比较 j得等于0(下标开始)最大下标比位数小1(所以小于),然后随轮次移动,部分数已就位不需要比较
		//			a.length-i注意下面比较的是j和j+1
			for(int j=0;j<a.length-i;j++) {
    	//		判断是否交换,去移位,用下标
				if(a[j]>a[j+1]) {
					int temp=a[j];
					a[j]=a[j+1];
					a[j+1]=temp;
				}
			}
		}

选择排序

  • 每次把当中最小的放在最左边
  • 先拿出第一个元素,假设其为最小,然后依次比较,在这个过程中如果有比第一个小的就交换位置,把最小的放在第一位
  • 用临时变量去交换
    目的是拿一个数和其他数比较取最小放在左边,每一个循环有一个基点,取的数放在基点
//	从小到大排序
	public static void selectSort(int[] a) {
//	 	外层用于表示拿的数,基点位置
		//为什么不是取(int i=1;i<a.length;		)因为下方需要用到以这个为下标去比较
		for(int i=0;i<a.length-1;i++) {
			int min=i;
//			内层以基点的数和其后的数一一比较,并将最小的数的下标存入min
			for(int j=i+1;j<a.length;j++) {
				if(a[min]>a[j]) {
					min=j;
				}
			}
//			对比最小数的下标和基点数下标是否相等,不等则换值
			if(min!=i) {
				int temp=a[i];
				a[i]=a[min];
				a[min]=temp;
			}
		}
	}

二分法查找

要求: 必须是一个已经排序好的数组;且没有重复数据的干扰
思路:
数组中:

  • 确定起始位置(0)和终止位置(arr.length-1)

  • 判断中间位置是否符合要查询数

  • 判断是升序还是降序还是空或null

        升序:
                 目标大于中间        起始位置=中间位置+1,结束位置不变
                 目标小于中间        结束位置=中间位置-1,  起始位置不变
     	 降序:
                 目标大于中间        结束位置=中间位置-1,  起始位置不变
     		     目标小于中间        起始位置=中间位置+1,结束位置不变
        空或null  返回-1
    

一个有序的数组,比较起始值,中间值,末尾值,不停的比较确定位置区域,缩小范围最终定位到该数据

//		升序
		int[] arr= {1,2,3,4,5,6,77,88,99,100};
		int a=5;
		int Index=binarySearch(arr, a);
		System.out.println(a+" 在数组上的位置下标为 "+Index);
	}
	public static int binarySearch(int[] arr,int a) {
//		先确定是否是空数组或null
		if(arr==null||arr.length==0) {
			return -1;
		}
//		初始化起始和终止,以及中间位置
		int start=0;
		int end=arr.length-1;
		int mid=(start+end)/2;
		while(start<=end) {
			if(a==arr[mid]) {
				return mid;
				}else if(a>arr[mid]){
//				目标大于中间   起始位置=中间位置+1,结束位置不变
					start=mid+1;
				}else {
//					目标小于中间        结束位置=中间位置-1,  起始位置不变
					end=mid-1;
				}
//			持续更新中间值下标
			mid=(start+end)/2;
			}
//		上面执行依然无结果,则数组中无该值,返回-1
		return -1;
	}

猜你喜欢

转载自blog.csdn.net/lfz9696/article/details/107742115