Java小白入门200例66之快速排序

Posted 编程界明世隐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java小白入门200例66之快速排序相关的知识,希望对你有一定的参考价值。

作者简介

作者名:编程界明世隐
简介:CSDN博客专家,从事软件开发多年,精通Java、javascript,博主也是从零开始一步步把学习成长、深知学习和积累的重要性,喜欢跟广大ADC一起打野升级,欢迎您关注,期待与您一起学习、成长、起飞!

引言

很多Java初学者问我,新手明明很用心、很努力学习的Java知识,转头又忘记了,很让人犯愁,小白如何能够快速成长、成为大牛呢?
其实要成为大神的技巧只有一个:“多学多练”,于是明哥就整理了比较典型的练习实例,通过练习能够快速提升编码技巧和熟练度,让你在成为大佬的路上一去不复返(切记要亲手练习哦)!

导航

✪ Java小白入门200例系列目录索引
◄上一篇  65.Java sort()数组排序
►下一篇  67.选择排序

简述

快速排序是一种排序执行效率很高的排序算法,它利用分治法来对待排序序列进行分治排序,它的思想主要是通过一趟排序将待排记录分隔成独立的两部分,其中的一部分比关键字小,后面一部分比关键字大,然后再对这前后的两部分分别采用这种方式进行排序,通过递归的运算最终达到整个序列有序。

快排思路

  1. 假设我们对数组{66, 3, 11, 100, 99, 37, 85}进行快速排序。
  2. 首先在这个数组中找一个元素作为基准数,开始就取第一个数66。
  3. 遍历数组,将小于基准数的放置于基准数左边,大于基准数的放置于基准数右边,得到类似{37, 3, 11, 66, 99, 100, 85}。
  4. 此时66两边对应两段,可以理解成两个数组{37,3,11}和{99,100,85}。
  5. 利用递归算法,对两个子数组进行排序。

实现代码

代码中有详细的注释,就不另作说明了

package demo.demo66;

public class Quick {

	public static void main(String[] args) {
		int[] arr = { 66, 3, 11, 100, 99, 37, 85 };

		System.out.println("排序前:");
		for (int val : arr) {
			System.out.print(val + " ");
		}
		doQuick(arr);
		System.out.println("\\n排序后:");
		for (int val : arr) {
			System.out.print(val + " ");
		}
	}
	//快速排序入口
	private static void doQuick(int[] arr) {
		if (arr.length > 0) {
			doQuickSort(arr, 0, arr.length - 1);
		}
	}
	//执行快速排序
	private static void doQuickSort(int[] arr, int start, int end) {
		if(start < end) {
			// 获取中间分界点
			int middle = getMiddle(arr, start, end);
			//低方向排序(递归)
			doQuickSort(arr, start, middle - 1);
			//高方向排序(递归)
			doQuickSort(arr, middle + 1, end);
		}
	}

	// 将数组分成高低两部分
	private static int getMiddle(int[] arr, int start, int end) {
		//获取临时数据
		int tmp = arr[start];
		while (start < end) {
			//从最右边开始,一旦发现有比tmp小的,则退出此while循环
			while (start < end && arr[end] > tmp) {
				end--;
			}
			//此时得到的end就是比临时中轴小的,需交换
			arr[start] = arr[end]; // 比中轴小的记录移到低方向
			
			//从最左边开始,一旦发现比tmp大 的,则退出此while循环
			while (start < end && arr[start] < tmp) {
				start++;
			}
			//此时得到的start就是比临时中轴大的,交换数据
			arr[end] = arr[start]; // 比中轴大的记录移到高端
		}
		//将中轴数据交换到中轴位置
		arr[start] = tmp;
		//返回中轴位置
		return start;
	}

}

运行结果:

排序前:
66 3 11 100 99 37 85
排序后:
3 11 37 66 85 99 100

小结

这节总结了“快速排序”,希望能对大家有所帮助,请各位小伙伴帮忙 【点赞】+【收藏】+ 【评论区打卡】, 如果有兴趣跟小明哥一起学习Java的,【关注一波】不迷路哦。

评论区打卡一波让我知道你,明哥会持续关注你的学习进度哦!

导航

✪ Java小白入门200例系列目录索引
◄上一篇  65.Java sort()数组排序
►下一篇  67.选择排序

热门专栏推荐

1.Java小游戏系列(俄罗斯方块、飞机大战、植物大战僵尸等)
2.JavaWeb项目实战(图书管理、在线考试、宿舍管理系统等)
3.JavaScript精彩实例(飞机大战、扫雷、贪吃蛇、验证码等)
4.Java小白入门200例
5.从零学Java、趣学Java、以王者荣耀角度学Java

以上是关于Java小白入门200例66之快速排序的主要内容,如果未能解决你的问题,请参考以下文章

Java小白入门200例67之选择排序

Java小白入门200例65之Java sort()数组排序

Java小白入门200例98之Java异常

Java小白入门200例95之Java匿名类

Java小白入门200例105之Java ArrayList类

Java小白入门200例107之Java LinkedList类