day12选择排序和二分查找

一. 选择排序:

      1.选择排序的思想:从0索引开始,用它对应的元素依次和后面索引对应的元素进行比较,小的往前放,第一次比较完毕,最小值出现在了最小索引处,依次这样进行比较。

        2.选择排序的具体过程:

           原始数组:

            24  69  80  57  13

           第一次比较结果:

           13   69  80  57  24  (0索引对应的元素24分别和69、80、57、13进行比较,24比13大,所以24和13交换位                                                   置)

            第二次比较结果:

           13   24  80  69  57  (1索引对应的元素69分别和80、57进行比较,69比57小,所以69和57交换位置,然后57                                             继续和24进行比较,57比24大,继续交换位置)

            第三次比较结果:

           13  24  57  80  69    (2索引对应的80和69比较,80比69大,交换位置,然后69继续和57比较,69比57大,交                                              换位置)

           第四次比较结果:

           13  24  57  69  80     (3索引对应的80和69进行比较,80比69大,交换位置,便得到了最终比较结果)

3.选择排序的规律:

   (1)用0索引对应的元素依次和后面的索引对应的元素进行比较,小的往前放。

   (2)依次用1索引......到最后,arr.length-2索引和arr,length-1索引进行比较。

4.选择排序的代码:

public static void selectSort(int[] arr){
		for(int x = 0 ;x < arr.length-1 ;x++){
			for(int y = x +1 ; y<arr.length ; y++){
				//判断
				if(arr[y]<arr[x]){
					int temp = arr[x] ;
					arr[x] = arr[y] ;
					arr[y] = temp ;
				}
			}
		}
	}

二.二分查找(折半查找)

     1.折半查找的前提条件:数组必须是有序的(已经是一个排好序的数组)
     2.折半查找的思想:猜想中间索引,这样可以将数组减半
     3.折半查找的步骤:
        (1)有一个排好序的数组
        (2)定义最小索引和最大索引
        (3)计算中间索引
        (4)拿中间索引对应的元素和要查找的元素进行比较,如果相等,则直接返回中间索引;如果不相等,大了,                    左边找;小了,右边找。
        (5)重新获取最小索引和最大索引。
                  大了,左边找:int max=mid-1;
                  小了,右边找:int min=mid+1;
        (6)重新计算中间索引回到第4步继续进行查找
   4.折半查找图解:
        
        

5.折半查找代码:

            

public class ArrayDemo {
	
	public static void main(String[] args) {
		//定义一个数组,静态初始化
		int[] arr = {11,22,33,44,55,66,77} ;
		
		//需求:查找33元素对应的索引
		int index = getIndex(arr, 33) ;
		System.out.println("index:"+index);
		
		//需求:要查找333元素对应的索引
		//如果查找的这个元素在数组中查不到呢?
		int index2 = getIndex(arr, 333) ;
		System.out.println("index2:"+index2);
	}
	
	/**
	 * 两个明确:
	 * 	明确返回值类型:int类型
	 * 明确参数类型,几个参数:int[] arr,int value
	 */
	public static int getIndex(int[] arr,int value){
		//定义最大索引和最小索引
		int max = arr.length -1 ;
		int min = 0 ;
		
		
		//计算中间索引
		int mid = (max + min)/2 ;
		
		//拿中间索引对应的元素和要查找的value元素进行比较
		while(arr[mid] !=value){
			//当前mid索引对应的元素不等于value元素,分两种情况
			if(arr[mid]>value){
				//重新获取最大索引
				 max = mid -1 ;
			}else if(arr[mid]<value){
				min = mid +1 ;
			}
			
			//如果找不到了应该返回-1
			//判断
			if(min>max){
				return -1 ;
			}
			
			//重新获取最大和最小索引,计算中间索引
			mid = (max+min)/2 ;
			
		}
		return mid ; //如果直接相等,直接返回
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值