八大排序之——快速排序(六)

本文介绍了快速排序的基本思想及其实现方式,并通过Java代码详细展示了快速排序的过程。重点讲解了如何选择基准值以及递归排序的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

建议哔哩哔哩一下:
快速排序;
快速排序的思想:

  1. 递归,然后每一次有一个标准,执行之后的结果就是,标准的左边的值都比右边的值小。

注意:

  1. 快速排序的思想都是一致的,但是不同代码选择的标准可能是不同的
    比如:
    1. 第一个元素
    2. 中间位置的元素
    3. 最后一个元素

归并排序是先递归再排序
快速排序是先排序再递归

图示

快排

代码



import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

public class quickSort {
	/*
	 * 快速排序
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr1 = { 1,2,3,10,4,5,6,23,45};
		quick(arr1, 0, arr1.length - 1);
		System.out.println(Arrays.toString(arr1));

		int[] arr = new int[30000000];
		for (int i = 0; i < 30000000; i++) {
			arr[i] = (int) (Math.random() * 8000000); // 生成一个[0, 8000000) 数
		}
		Date data1 = new Date();
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String date1Str = simpleDateFormat.format(data1);
		System.out.println("排序前的时间是=" + date1Str);

		long startMili = System.currentTimeMillis();
		System.out.println("开始         " + startMili);

		// 测试冒泡排序
//		quick(arr, 0, arr.length - 1);

		long endMili = System.currentTimeMillis();
		System.out.println("耗时         " + (endMili - startMili));

		Date data2 = new Date();
		String date2Str = simpleDateFormat.format(data2);
		System.out.println("排序后的时间是=" + date2Str);

	}

	// 实现快速排序
	public static void quick(int[] arr, int left, int right) {
		int a=left;
		int b=right;
		int mid=(left+right)/2;
		int pointer=arr[mid];
		int temp=0;
		if(left==mid) {
			if(arr[left]>arr[right]) {
				temp=arr[left];
				arr[left]=arr[right];
				arr[right]=temp;
			}
			return;
		}
		//排序
		while (a<b) {
			while (arr[a]<pointer&&a<b) {//左边找小于标准的
				a++;
			}
			while (arr[b]>pointer&&a<b) {//右边找大于标准的
				b--;
			}
			if(a<b) {//找到了就交换位置
				temp=arr[a];
				arr[a]=arr[b];
				arr[b]=temp;
				a++;
				b--;
			}		
		}
		//向左递归
		quick(arr, left, b);
		//向右递归
		quick(arr, a, right);
		
	}
}













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值