快速排序java代码

快速排序算法有点像冒泡排序但是比冒泡排序要高效,时间复杂度是nlogn
好了,废话不多说直接开始快速排序的原理。
4, 3, 6, 7, 2, 9,-4,-90,67,88,4 这是一个无序的数组,快速排序的第一步就是找到一个数当作一个中间数,然后把小于这个数的放在它的左边,大于它的数的放在右边(降序反之)。例如:我选择第一个数字4当作中间数,然后开始找3比4要小放到左边3,4 , 6, 7, 2, 9,-4,-90,67,88,4,6比4要大放到右边3,4 , 6, 7, 2, 9,-4,-90,67,88,4,剩下就是一样的,然后就完成了第一次的排序-90, 3, 2, -4, 4, 9, 7, 6, 67, 88, 4,再一次就是把4左边的选择第一个(看你自己)重复上面的操作,把4右边的重复上面的操作,这里就是一个递归的过程。因为没有图片可能大家理解起来还是不太好,我就直接来代码吧。

public class Test13 {
	public static void main(String[] args) {
		int arr[] ={ 4, 3, 6, 7, 2, 9,-4,-90,67,88,4 };
		quickSort(arr, 0, arr.length-1);
		System.out.println(Arrays.toString(arr));
	
		
	}
	public static void quickSort(int[] arr,int left,int right) {//快排函数
		if (left<right) {//这里是递归的条件,我们不可以让递归一直进行,
		//要防止栈溢出,当左边大于右边的时候这就说明只有一个数进行排序我
		//们也就没有必要比较,然后排序了说明就已经排好了
			int s=result(arr, left, right);//这里是获得每一次递归后的你选取的第一个数字当作中间数后现在在数组的第几个,s就是第几个的下标
			quickSort(arr, left, s-1);//这里是左递归,s-1就是中间数前一个
			quickSort(arr, s+1, right);//这里是右递归
			
		}
		
	}
	public static void swap(int i,int j,int arr[]) {//这是是一个交换的函数
		int temp=arr[i];
		arr[i]=arr[j];
		arr[j]=temp;
	}
	public static int result(int[] arr,int p,int q) {//这个比较的重要,就是返回排序的那个s的
		int x=arr[p];//获得中间数,x就是中间数p的选择一般是选择数组的第一个
		int i=p,j;//i就是从p开始
		for (j=p+1;j<arr.length;j++) {
			if (x>arr[j]) {//当中间数大于数组中的一个数的时候
				i++;//i加一就是往后移一位,再交换,这里有些人理解起来有点问题
				//比如4 6 3 8这个数组,4是x,x是小于6的所以不用管,x大于3
				//i前面是等于p=0的所以i++,i就是1了,i=1和j=2进行交换就是4 3 6 8
				swap(i, j, arr);
			}
		}
		swap(p, i, arr);//这一步也是关键,因为我们前面都没有对中间数进行交换
		//所以这里要做一个交换
		return i;//返回的就是中间数的下标
	}

}

好了,我觉得我的代码解释的已经很明白了,我把我当时遇到的不理解的地方,都重点给大家讲了一下,希望对大家有帮助

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值