Java实现快速排序算法-Quick Sort

news/2024/5/19 22:17:14 标签: 数据结构, 算法, java, 快速排序, 排序算法

算法简介

快速排序(Quick Sort) 是由冒泡排序改进而得的。在冒泡排序过程中,只对相邻的两个记录进行比较,因此每次交换两个相邻记录时只能消除一个逆序。如果能通过两个(不相邻)记录的一次交换直接消除多个逆序,则会大大加快排序的虚度。快速排序方法中的一次交换可以消除多个逆序。

算法步骤

在待排序的n个记录中任取一个记录(通常选取第一个记录)作为枢轴,设其关键字为pivotkey。经过一趟排序后,把所有关键字小于pivotkey的记录交换的前面,把所有大于pivotkey的记录交换到后面,结果将待排序记录分成两个子表,最后将枢轴放置在分界处的位置。然后对左右两个子表重复上述过程,直到每一个子表只有一个记录时,排序完成。换句话说,就是每一趟排序都将一条记录放在了正确的位置上。(正确位置就是完成排序时它所处的位置)

具体步骤

  1. 选择待排序表中第一个记录作为枢轴,保存在变量pivotkey中。附设两个指针lowhigh,初始时分别指向表的上界和下界(第一趟时,low = 0;high = nums.length)。
  2. 从表的最右侧位置依次向左侧搜索,当找到第一个值小于pivotkey的记录时,将其移动到low处。具体操作是:当low < high时,若high所指记录大于等于pivotkey,则向左移动指针high;否则移动该记录。
  3. 然后从表的最左侧位置依次向右侧搜索,找到第一个关键字大于pivotkey的记录,将其移动到high处。具体操作是:若low所指记录的值小于pivotkey,则向右移动指针low;否则移动该记录。
  4. 重复步骤2和3,直至lowhigh。此时lowhigh的位置即为枢轴在此躺排序的最终位置,原表被分为两个子表。

代码实现

java">public class Sort {
    public static void main(String[] args) {
        int[] nums = new int[]{1, 321, 34, 54, 56, 745, 7546,3,423,463,64,234,143421};
        quickSort(nums);
        for (int n : nums) {
            System.out.println(n);
        }
//        1
//        3
//        34
//        54
//        56
//        64
//        234
//        321
//        423
//        463
//        745
//        7546
//        143421
    }
    public static void quickSort(int[] nums) {
        qSort(nums,0,nums.length - 1);
    }
    public static void qSort(int[] nums,int low,int high) {
        if(low < high) {
            int pivotloc = partition(nums,low,high);
            qSort(nums,low,pivotloc - 1);
            qSort(nums,pivotloc+1,high);
        }

    }
    public static int partition(int[] nums,int low,int high) {
        int pivotkey = nums[low];  //用于比较的枢轴
        while (low < high) {
            while (low < high && nums[high] >= pivotkey) { high --; }
            nums[low] = nums[high];
            while (low < high && nums[low] <= pivotkey) { low ++;}
            nums[high] = nums[low];
        }
        nums[low] = pivotkey;
        return low;
    }
}

http://www.niftyadmin.cn/n/1711825.html

相关文章

Activiti7教程-基础

一. 工作流介绍 1.1 概念 工作流(Workflow)&#xff0c;就是通过计算机对业务流程自动化执行管理。它主要解决的是“使在多个参与者之间按照某种预定义的规则自动进行传递文档、信息或任务的过程&#xff0c;从而实现某个预期的业务目标&#xff0c;或者促使此目标的实现”。…

基于Echarts实现可视化数据大屏水质分析系统大屏数据

前言 &#x1f680; 基于 Echarts 实现可视化数据大屏响应式展示效果的源码,&#xff0c;基于htmlcssjavascriptecharts制作&#xff0c; 可以在此基础上重新开发。 本项目中使用的是echarts图表库&#xff0c;ECharts 提供了常规的折线图、柱状图、散点图、饼图、K线图&…

操作系统-信号量机制

信号量机制 用户进程可以通过使用操作系统提供的一对原语来对信号量进行操作&#xff0c;从而很方便的实现了进程互斥、进程同步。 什么是信号量&#xff1f; 信号量其实就是一个变量&#xff08;可以是一个整数&#xff0c;也可以是更复杂的记录型变量&#xff09;&#xff…

基于Echarts实现可视化数据大屏厅店营业效能分析

前言 &#x1f680; 基于 Echarts 实现可视化数据大屏响应式展示效果的源码,&#xff0c;基于htmlcssjavascriptecharts制作&#xff0c; 可以在此基础上重新开发。 本项目中使用的是echarts图表库&#xff0c;ECharts 提供了常规的折线图、柱状图、散点图、饼图、K线图&…

以非递归的方式实现二叉树的三种遍历

二叉树的代码定义 //Definition for a binary tree node. public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) {this.val val;}TreeNode(int val, TreeNode left, TreeNode right) {this.val val;this.left left;this.right ri…

Activiti7教程-进阶

一、流程实例 1. 什么是流程实例 流程实例&#xff08;ProcessInstance&#xff09;代表流程定义的执行实例。 一个流程实例包括了所有的运行节点。我们可以利用这个对象来了解当前流程实例的进度等信息。 例如&#xff1a;用户或程序按照流程定义内容发起一个流程&#xff0…

基于Echarts实现可视化数据大屏通用大数据可视化展示平台模板

前言 &#x1f680; 基于 Echarts 实现可视化数据大屏响应式展示效果的源码,&#xff0c;基于htmlcssjavascriptecharts制作&#xff0c; 可以在此基础上重新开发。 本项目中使用的是echarts图表库&#xff0c;ECharts 提供了常规的折线图、柱状图、散点图、饼图、K线图&…

C语言模拟实现先来先服务(FCFS)和短作业优先调度算法(SJF)

说明 该并非实现真正的处理机调度&#xff0c;只是通过算法模拟这两种调度算法的过程。 运行过程如下&#xff1a; 输入进程个数输入各个进程的到达事件输入各个进程的要求服务事件选择一种调度算法程序给出调度结果&#xff1a;各进程的完成时间、周转时间、带权周转时间。 …