快速排序之Java实现

快速排序思想:

从数组中挑选一元素作为基数(一般选数组第一个数字),然后通过排序,将比此数大的排到它 的左边,比它小的排到右边;然后再分别对左右两边的子数组进行相应排序,直到子数组的长度是1 ,排序结束。

举例说明:一组数:arr  = {5,9,1,3,52,13,2,8,4}

选择第一个数字,5,作为基数,i = 0,j=8;

(1)从数组后边开始,4比5小,那么将4,赋值给arr[0],然后i++;此时 i = 1,j = 8;(首先从后往前比较,如果数字比基数小,那么此值赋给arr[i++],下一步从前往后开始比较;如果数字比基数大,那么j--,下一步依旧从后边取数字与基数比较)。数组变成:{4,9,1,3,52,13,2,8,4},i = 1, j =8

(2)从数组下标是1位置开始,9比5大,那么将9 的值赋给 arr[8];(从前往后比较,如果数字比基数大,那么此值赋给arr[j--],下一步从后往前比较;如果数字比基数小,那么i++,下一步依旧从前往后比较)。数组变成:{4,9,1,3,52,13,2,8,9} , i = 1,j = 7

(3)数组下标是7的数字与5比较,比5 大,那么 :数组变成:{4,9,1,3,52,13,2,8,9} , i = 1,j = 6

(4)数组下标是6的数字与5比较,2比5小,那么将2,赋值给arr[1],然后i++。此时数组变成:{4,2,1,3,52,13,2,8,9}, i = 2,j = 6;

(5)数组下标是2的数字与5比较,1比5小,i++。此时数组变成:{4,2,1,3,52,13,2,8,9}, i = 3,j = 6;

(6)数组下标是3的数字与5比较,3比5小,i++。此时数组变成:{4,2,1,3,52,13,2,8,9}, i = 4,j = 6;

(7)数组下标是4的数字与5比较,52比5大,那么将52的值赋给 arr[6],且 j--。此时数组变成:{4,2,1,3,52,13,52,8,9}, i = 4,j =5;

(8)数组下标是5的数字与5比较,13比5大,那么 j--。此时数组变成:{4,2,1,3,52,13,52,8,9}, i = 4,j =4;

(9)令arr[i] = 5,即arr[4] = 5。此时数组:{4,2,1,3,5,13,52,8,9}, i = 4,j =4;

(10)然后基数左右两边的子数组再按照上述逻辑递归操作即可。

代码实现:

public static void quickSort(int [] arr,int begin,int end) throws Exception{
		if(arr == null || begin < 0 || end < 0 || begin > end)
			throw new Exception("参数输入有误");
		if(begin < end){
			int first = begin;
			int last = end;
			int temp = arr[first];
			while(first < last){
				while(first < last && arr[last] > temp){
					last--;
				}
				if(first < last)
				arr[first++] = arr[last];
				while(first < last && arr[first] < temp){
					first++;
				}
				if(first < last)
				arr[last--] = arr[first];
			}
			arr[first] = temp;
			quickSort(arr,begin,first-1);
			quickSort(arr,first+1,end);
		}
	}
测试:

public static void main(String[] args) throws Exception {
		int [] arr = {5,9,1,3,52,13,2,8,4};
		quickSort(arr,0,8);
		for(int i : arr){
			System.out.println(i);
		}
	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值