开发中常见的算法汇总之-快速排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cpongo4/article/details/89333882
#### 快速排序 - 核心思想 - 快速排序其核心点在于找准分区点(分区点的选择直接决定了快排的效率),将待排数列按照分区点划分为2部分:分区点左边数据小于分区点值,分区点右边数据大于分区点值为规则分别进行排序 - 分区点的意义在于通过分区方式将大数列拆解成多个子序列进行排序,算法思想上运用**分治法思想** - 特性 - 是一种非稳定排序,数据分区后会将分区点两边数据进行互换(相同元素顺序会变动) - 元素互换时可以通过交换方式移动(不需要额外空间辅助),属于原地排序 - 可以采用递归方式进行数据分区排序 - 步骤 - 根据数列起始索引和末尾索引递归计算分区值(依次比较并交换元素:小于分区值元素至于分区值左侧,大于分区值元素至于分区值右侧) - 递归处理分区值左侧数列排序 - 递归处理分区值右侧数列排序 - 图解 006tNc79ly1g1qzw2lmreg30sg0u5tt5.gif - 示例 ```java package com.lyd.algorithm.sort; import com.lyd.utils.RandomUtils; import lombok.extern.slf4j.Slf4j; /** * 描述:快速排序 *

* # *

* * @author lyd Date 2019/4/4 ProjectName:datastructure-algo Version: 1.0 */ @Slf4j public class QuickSort { /** * 快速排序 * @param data 待排数列 * @return 排序后数据集 */ public static int[] quickSort(int[] data) { if (null == data || data.length < 1) { return data; } sort(data, 0, data.length - 1); return data; } /** * 快排 * @param data 待排数列 * @param left 数列起始索引 * @param right 数列末尾索引 */ private static void sort(int[] data, int left, int right) { //如果分区点左边和右边距离重叠表示排序结束 if (left >= right) { return; } //计算分区点 int pivot = partition(data, left, right); //递归处理分区点左边数列 sort(data, left, pivot - 1); //递归处理分区点右边数列 sort(data, pivot + 1, right); } private static int partition(int[] data, int left, int right) { //默认找数列首位元素作为分区值 int pivotElement = data[left]; //当起始索引没有和末尾索引重叠时循环进行元素交换:小于分区值至于分区值左侧,大于分区值至于分区值右侧 while (left < right) { //因为分区值默认取起始位置元素,所以交换时一定要先从右侧开始查找 //从分区值右侧开始循环查找小于分区值的元素 while(data[right] >= pivotElement && left < right){ right--; } //将找到的元素交换至分区值左侧 data[left] = data[right]; //从分区值左侧开始循环查找大于分区值的元素 while(data[left] <= pivotElement && left < right){ left++; } //将找到的元素交换至分区值右侧 data[right] = data[left]; } //将分区值元素至于左侧末尾位置 data[left] = pivotElement; return left; } public static void main(String[] args) { // int[] sorts = new int[]{13, 15, 13, 5, 6, 11, 16, 20, 17, 12, 5, 6, 11, 16, 20, 17}; int[] sorts = RandomUtils.intArrays(15,20); int[] result = quickSort(sorts); log.info("sorts:{}", result);//[5, 5, 6, 6, 11, 11, 12, 13, 13, 15, 16, 16, 17, 17, 20, 20] } } ```

猜你喜欢

转载自blog.csdn.net/cpongo4/article/details/89333882
0条评论
添加一条新回复