冒泡排序与二分搜索法总结

1. 常见的数组排序

常见的数组排序:

1:冒泡排序

2:插入排序

3:选择排序

4:快速排序(sort()排序)

2. 冒泡排序

冒泡排序:
步骤:
1:两两做大于比较,大的往后移,小的往前移,把最大的值找出来,放在倒数第1位,这个时候,我们数组划分为2部分,排好序是一部分,未排序的是一部分
2:两两做大于比较,大的往后移,小的往前移,把第二大的值找出来,放在倒数第2位,这个时候,我们数组划分为2部分,排好序是一部分,未排序的是一部分
3:依次类推,直到把所有的数字都按照从小到大的顺序,排列

 冒泡优化
 1:把中间变量从小循环的里面,拿出来放在最大循环的外面声明,可以减少声明次数:    
 2:每排序出一个元素后,后面的排序,就可以减少一次  
    第1大的数 排序7 次
    第2大的数 排序6 次
    第3大的数 排序5次
    以此类推
    第8大数    排序0次
 3:针对数组本身就是有序的 

public static void main(String[] args) {
	int[] s = {100,56,88,99,47,65,12,10} ;//原数组 乱序
	//int[] s = {1,2,3,4,5,6,7,8} ;//原数组 乱序
	int count = 0;
	int temp = 0; //中间变量,存放需要交换元素的变量
		
	//外层循环控制元素的排序次数
	for(int j=1;j<s.length;j++){
		boolean flag = true;  //表示假如数组是有序的
		//里层循环控制元素的交换次数,交换次数呈递减规律
		for(int i = 0;i<s.length-j;i++){
			count++;
			//如果前一个元素比后一个元素大
			if(s[i]>s[i+1]){
			//如果第一个元素比第二个元素大,交换位置
				temp = s[i];
				s[i] = s[i+1];
				s[i+1] = temp;
				flag = false; //给数组一个标记
				}
			}
			//如果flag还为true,代表这个数组本身就是有序的
			if(flag){
			    //后面的循环就不需要了
		    	break;
			}
			
		}
		System.out.println(count);
		System.out.println(Arrays.toString(s));

3. 二分搜索法

  • 二分搜索法(折半查找)前提是这个数组必须是有序的
  • Arrays.binarySearch()
  • 注意:二分搜索法:根据元素查找下标
  • 找到返回当前元素的下标,没有找到返回负数
public static void myBinarySearch(int[] arr,int ele){
	//确保数组有序
	Arrays.sort(arr);
	//int[] arr = {-10,1,10,20,45,56,88}; 
	//定义开始和结尾的2个下标
	int start = 0;
	int end = arr.length;
	int index =-1;
	//保证开头下标不能超过结尾下标,否则数组就会越界
	int count = 0;
	while(start<=end){
		count++;
		int  mid = (start+end)>>>1; //折半点
		//如果目标元素和中间元素相等
		if(arr[mid]==ele){
			//把中间元素的下标赋值给index,代表找到这个元素的下标
			index = mid;
			//后面就不用比较了
			break;
			//如果目标元素比中间元素的值大
		}else if(ele>arr[mid]){
			//去数组的右边来找 并且,start变成mid+1的值,end值不变
			start = mid+1;
			//如果目标元素比中间元素的值小
		}else{
			//去数组的右边来找 并且,end变成mid-1的值,start值不变
			end = mid-1;
		}
	}
	System.out.println(count);
	if(index!=-1){
		System.out.println("元素:"+ele+"的下标是:"+index);
	}else{
		System.out.println("不存在此元素");
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值