Java数据结构与算法——快速排序

简介: Java数据结构与算法——快速排序

1.关于快排


快速排序Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

2.代码案例


package com.szh.sort;
import java.util.Arrays;
/**
 *
 */
public class QuickSort {
    private static void quickSort(int[] arr, int left, int right) {
        int l = left;  //左下标
        int r = right; //右下标
        int middle = arr[(left + right) / 2]; //以数组的中间元素为基准
        int temp = 0; //临时变量,作为交换元素时使用
        //while循环的目的是让比middle值小放到左边,比middle值大放到右边
        while (l < r) {
            //在middle的左边一直找,直到找到大于等于middle的值,循环才结束
            while (arr[l] < middle) {
                l++;
            }
            //在middle的右边一直找,直到找到小于等于middle的值,循环才结束
            while (arr[r] > middle) {
                r--;
            }
            //如果 l >= r,说明middle左边的值全都是小于等于它的,右边的值全都是大于等于它的
            //也可能middle的左边没有值,右边全都是大于等于它的
            //也可能middle的右边没有值,左边全都是小于等于它的
            if (l >= r) {
                break;
            }
            //进行元素交换
            temp = arr[l];
            arr[l] = arr[r];
            arr[r] = temp;
            //交换完成之后,如果arr[l]==middle,则需要让右下标向前移动一位
            if (arr[l] == middle) {
                r--;
            }
            //交换完成之后,如果arr[r]==middle,则需要让左下标向后移动一位
            if (arr[r] == middle) {
                l++;
            }
        }
        //如果此时 l == r,必须执行如下操作,否则会出现栈溢出
        if (l == r) {
            l++;
            r--;
        }
        //向左递归
        if (left < r) {
            quickSort(arr, left, r);
        }
        //向右递归
        if (right > l) {
            quickSort(arr, l, right);
        }
    }
    public static void main(String[] args) {
        int[] arr = {-9, 78, 0, 23, -567, 70, -1, 900, 4561};
        System.out.println("排序前:");
        System.out.println(Arrays.toString(arr));
        //测试快速排序
        quickSort(arr, 0, arr.length - 1);
        System.out.println("排序后:");
        System.out.println(Arrays.toString(arr));
    }
}


3.各种排序算法比较


相关文章
|
9天前
|
搜索推荐 C语言
【排序算法】快速排序升级版--三路快排详解 + 实现(c语言)
本文介绍了快速排序的升级版——三路快排。传统快速排序在处理大量相同元素时效率较低,而三路快排通过将数组分为三部分(小于、等于、大于基准值)来优化这一问题。文章详细讲解了三路快排的实现步骤,并提供了完整的代码示例。
36 4
|
1月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
69 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
1月前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
105 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
1月前
|
算法 搜索推荐 Shell
数据结构与算法学习十二:希尔排序、快速排序(递归、好理解)、归并排序(递归、难理解)
这篇文章介绍了希尔排序、快速排序和归并排序三种排序算法的基本概念、实现思路、代码实现及其测试结果。
20 1
|
1月前
【初阶数据结构】打破递归束缚:掌握非递归版快速排序与归并排序
【初阶数据结构】打破递归束缚:掌握非递归版快速排序与归并排序
|
1月前
|
算法
蓝桥杯宝藏排序 | 数据结构 | 快速排序 归并排序
蓝桥杯宝藏排序 | 数据结构 | 快速排序 归并排序
|
1月前
|
搜索推荐 Java Go
深入了解快速排序算法
深入了解快速排序算法
32 2
|
1月前
|
算法 Java Linux
java制作海报一:java使用Graphics2D 在图片上写字,文字换行算法详解
这篇文章介绍了如何在Java中使用Graphics2D在图片上绘制文字,并实现自动换行的功能。
97 0
|
1月前
|
存储 搜索推荐 算法
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
|
1月前
|
算法 Python
Python算法编程:冒泡排序、选择排序、快速排序
Python算法编程:冒泡排序、选择排序、快速排序