以一边为基数的快速排序法

6 篇文章 0 订阅

看写法二吧,写法一将方法抽离出来,却降低了效率。
写法一(经实测,数据量大时,容易会溢出。)

	private void quickSort3(int[] arr, int left, int right) {
		if(left<right){
			int middle = getMiddle(arr,left,right);//实际的排序流程
			//利用分治法的思想对数组进行递归。
			quickSort3(arr, left, middle-1);
			quickSort3(arr, middle+1, right);
		}
	}

	private int getMiddle(int[] arr, int left, int right) {
		int base = arr[left];//以左侧为基数
		int index = left;//基数下标
		while(left<right){
			while(left<right&&arr[right]>=base){
				right--;
			}
			arr[index] = arr[right];//将基数所在下标对应的值改为找到的比基数小的值
			arr[right] = base;//将找到的比基数小的位置的值改为基数
			index = right;//修改基数下标
			while(left<right&&arr[left]<=base){
				left++;
			}
			arr[index] = arr[left];
			arr[left] = base;
			index = left;
		}
		return index;
	}

写法二

	private void quickSort3(int[] arr, int left, int right) {
		if(left<right){
			int base = arr[left];
			int middle = left;//记录基数的下标
			while(left<right){
				while(left<right&&arr[right]>=base){
					right--;
				}
				arr[middle] = arr[right];//将基数所在下标对应的值改为找到的比基数小的值
				middle = right;//修改基数所在的下标位置
				arr[right] = base;//将找到的比基数小的位置的值改为基数的值
				while(left<right&&arr[left]<=base){
					left++;
				}
				arr[middle] = arr[left];
				middle = left;
				arr[left] = base;
			}
			//运用分治法的思想对数组进行递归。
			quickSort3(arr, left, middle-1);
			quickSort3(arr, middle+1, right);
		}
	}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值