快速排序

最近做题,发现冒泡和选择排序的复杂度太大了,容易超时,于是就学习了快排****

快排:简单地说就是找到一个基准数字m,数组中比m大的放在右边,比m小的放在左边,这样m的位置是正确的的。然后利用递归再分别对两边进行快排

下面我逐步讲解一下快排的思路

1.假定对数组{6,1,7,5,3,11}进行快排
2.首先在这个序列中找一个数作为基准数,为了方便可以取第一个数6
3.进行初步快排之后,变成{5,1,3,6,7,11}
4.这是如何做到的呢,取6为基准
5.从数组最右向左边遍历找到一个比6小的数字,记为j
6.同理:遍历数组左边,找到比6大的数字,记为i
7.然后交换i和j所在位置的数字,然后继续检索
8.直到i= =j,表示本次检索已经结束,讲i与基准数字换位。此时基准数字已经找到自己的位置了
9.然后把数组根据基准数=左右分成两部分,利用递归再进行排序
就像:
原数组 :6,1,7,5,3,11---------key:6
第一次交换:6,1,3,5,7,11------3和7进行交换
第二次交换:5,1,3,6,7,11-------此时i==j
那么如果第四个数字5换成8会怎么样?当初我就感觉如果这样还要再加一个判断,思考一下,问题会在最后揭晓

接下来先上代码:`

import java.sql.Array;

import java.util.Arrays;
public class test1 {
	public static void main(String[] args) {
		int [] arr= {6,1,8,7,5,2,3,11};
		System.out.println(Arrays.toString(arr));
		quickSort(arr,0,arr.length-1);
		System.out.println(Arrays.toString(arr));
	}
	
	private static void quickSort(int[] arr, int left, int right) {
		if(left>=right) return;//如果边界相等,就直接结束循环了
		int key=arr[left];
		int i=left;
		int j=right;
		while(i<j) {
			while(i<j&&arr[j]>=key) {//遇到比key大的数字,向左检索
				j--;
			}
			while(i<j&&arr[i]<=key) {//从左开始,遇到比key小的数字,向右检索
				i++;
			}
			if(i<j) {
				int temp=arr[i];
				arr[i]=arr[j];
				arr[j]=temp;
			}
		}
		//此时i==j
		arr[left]=arr[i];
		arr[i]=key;	
		quickSort(arr, left, i-1);
		quickSort(arr, i+1, right);
		}
	
}

如果把5换成8,那么程序在执行下面这个语句是while(i<j&&arr[j]<key) {//遇到比key大的数字,向左检索 j--; }
因为满足条件,会自动向左在移动一位。我当时查资料的时候就一直迷在这里,以为还要再加一个判断

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值