快速排序

第一篇 写快速排序,我也是万万没想到,不过现学现卖,参考博客https://blog.csdn.net/sunhuaqiang1/article/details/52059322

根据这篇博客讲解的的原理手敲了一个快速排序,以便理解添加了独门的注释(只有我能看懂)代码可以精简,但实在是不想动了

吐槽(万恶的小偷偷了我的手机,丧尽天良,手机卡还补不了,移动的登录逻辑有问题,服务密码登录,需要验证码,不使用服务密码登录,只要有验证码就行了,那服务密码有个锤子用,为啥我拿身份证去还要输入服务密码)头脑里尽是些胡思乱想

 
//	快速排序 
//	left 起始位置下标
//	right 最后一位下标 最大长度-1
//	先定a[0]为基准数 从尾部向前遍历(j--) 找到比基准数小的就 进入内层循环 
//	内层循环 i从头部到j的位置 遍历 (i++) 找到比基准数大的就 让i和j 互换
	void fasterSort(int[] a,int left,int right){
		if(left>=right){
		    return;
		}
		int head = left; //i的起点  head体现i实际到哪了
		int foot = right;//j的起点 
		int bnum=left; //基准的位置下标
		int base = a[left];//以头部首位(左边第一个)为基准数
		for(int j = foot;j>=0;j--){ //j从后向前遍历
			if(a[j] <= base && head < j){ //遇到比基准小的停下
				for(int i=head;i<=j;i++){ //i从前往后遍历, i=head i每次从上次停下的位置开始
					head = i; //用于外层定位 i是否和j相遇
					if(a[i]>base){ //i 遇到比基准大的停下
//							此时 i 和j 互换
						int temp = a[j];
						a[j] = a[i];
						a[i] = temp;
						break; //跳出i的循环回到j的循环  再次从j开始 往前移动 直到i和j 相遇
					}
				}
			}
			if(head==j){//  j遇上了i  一轮结束了
//					将基准数放到他们相遇的位置  以新的基准(他们相遇位置的数 放到头部首位成为新基准)重新开始排顺
				int base2 = a[head];
				a[head] = a[left];
				a[left] = base2;
				bnum = j; //基数的位置
				break;
			}


		}
		for(int i = 0 ;i<a.length;i++){
			System.out.print(a[i]+",");
		}
		System.out.println();
//			fasterSort(a,0,right);
		fasterSort(a,left,bnum-1); //处理基准数前面的
		fasterSort(a,bnum+1,right);//处理基准数后面的


	}

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值