数据结构与算法之快速排序

2023-11-09

package com.yg.sort;/*
@author  GeQiLin
@date    2020/2/26  21:00
*/

import java.util.Arrays;

public class QuickSort {
    private static int max = 15;
    private static int arr[];

    public static void main(String[] args) {
        setArr();
        System.out.println("排序前: " + Arrays.toString(arr));
        quickSort(arr, 0, arr.length - 1);
        System.out.println("排序后: " + Arrays.toString(arr));
    }

    //构建数组大小和值
    public static void setArr() {
        arr = new int[max];
        for (int i = 0; i < max; i++) {
            arr[i] = (int) (Math.random() * max);
        }
    }

    //快排
     /*
    将第一个数设为基准
    使用两个指针r,l分别从后往前,和从前往后遍历数组
    r找小于基准的数,然后给arr【l】
    l找大于基准的数,找到后给arr[r]
    * */
    public static void quick_sort(int s[], int l, int r) {
        if (l < r) {
            //Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换 参见注1
            int i = l, j = r, x = s[l];
            while (i < j) {
                while (i < j && s[j] >= x) // 从右向左找第一个小于x的数
                    j--;
                if (i < j) {
                    s[i] = s[j];
                    i++;
                }
                while (i < j && s[i] < x) // 从左向右找第一个大于等于x的数
                    i++;
                if (i < j) {
                    s[j] = s[i];
                    j--;
                }
            }
            s[i] = x;
            quick_sort(s, l, i - 1); // 递归调用
            quick_sort(s, i + 1, r);
        }
    }

    //快排
    /*
    将第中间的数设为基准
    使用两个指针r,l分别从后往前,和从前往后遍历数组
    r找小于基准的数,l找大于基准的数
   然后交换arr[r]和arr[l]
    * */
    public static void quickSort(int[] arr, int left, int right) {
        //这个if用于结束分治
        if (left < right) {
            int r = right;
            int l = left;
            int middle = arr[(r+l)/2];
            int tem=0;
            while (l < r) {
                while (l < r && arr[r] >= middle)
                    r--;
                while (l < r && arr[l] < middle)
                    l++;
                //  交换
                if(l<r){
                    tem= arr[l];
                    arr[l]=arr[r];
                    arr[r]=tem ;
                }




            }
            arr[l] = middle;
            quickSort(arr, left, l - 1);
            quickSort(arr, l + 1, right);
        }
    }
}

3.将最后一个数作为基准排序

 public class QuickSort {
    public static void main(String[] args) {
    int []arr={1,3,5,6,3,45,6,7,8,2,5,9};
        QuickSort.sort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }
    private static int[]getPartition(int[] arr, int left, int right, int p){
        int index=left;
        int l=left-1;
        int r=right+1;
        while(index<r){
            if(arr[index]<p){
                QuickSort.swap(arr,++l,index++);
            }else if(arr[index]>p){
                QuickSort.swap(arr,--r,index);
            }else{
                index++;
            }

        }
        return new int[]{l+1,r-1};


    }
    private static void sort(int[] arr, int l, int r){
        if(l<r){
            //p[0]记录等于目标值的最小下标,p[1]记录等于目标值的最大下标
            //如12334 当目标值p为3 时 p[0]=2,p[1]=3
            int[] p = QuickSort.getPartition(arr, l, r, arr[r]);
            //遍历小于目标值部分
            QuickSort.sort(arr,l,p[0]-1);
            //遍历大于目标值部分
            QuickSort.sort(arr,p[1]+1,r);
        }

    }
    private static  void swap(int[] arr, int i, int j){
        int temp;
        temp=arr[i];
        arr[i]=arr[j];
        arr[j]=temp;
    }
}
               

4,随机选取基数快排解决有序集合选最后一个元素效率低问题

public class QuickSort {
    public static void main(String[] args) {
    int []arr={1,3,5,6,3,45,6,7,8,2,5,9};
        QuickSort.sort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }
    private static int[]getPartition(int[] arr, int left, int right, int p){
        int index=left;
        int l=left-1;
        int r=right+1;
        while(index<r){
            if(arr[index]<p){
                QuickSort.swap(arr,++l,index++);
            }else if(arr[index]>p){
                QuickSort.swap(arr,--r,index);
            }else{
                index++;
            }

        }
        return new int[]{l+1,r-1};


    }
    private static void sort(int[] arr, int l, int r){
        if(l<r){
            //随机选取参考值避免有序情况排序效率低
            QuickSort.swap(arr,l+(int)(Math.random()*(r-l+1)),r);
            //p[0]记录等于目标值的最小下标,p[1]记录等于目标值的最大下标
            //如12334 当目标值p为3 时 p[0]=2,p[1]=3
            int[] p = QuickSort.getPartition(arr, l, r, arr[r]);
            //遍历小于目标值部分
            QuickSort.sort(arr,l,p[0]-1);
            //遍历大于目标值部分
            QuickSort.sort(arr,p[1]+1,r);
        }

    }
    private static  void swap(int[] arr, int i, int j){
        int temp;
        temp=arr[i];
        arr[i]=arr[j];
        arr[j]=temp;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构与算法之快速排序 的相关文章

随机推荐

  • Matlab学习1.0

    1 Matlab通用命令 1 常用命令 cd 显示 or改变当前文件夹 dir 显示当前文件夹下的文件 clc 清空工作窗中显示的内容 load 加载指定文件的变量 diary 日志文件命令 调用DOS命令 home 光标移动到窗口最左上角
  • 网络安全知识库

    0x00 前言 本篇用来整理所有的零散的知识 作为一个技能树或者技能表来进行引导 CTF 加解密合集 CTF Web合集 0x01 Http 1 http头 1 1 本地访问识别 如何伪造http头 让后端认为是本地访问 0x02 Web
  • Python爬虫反反爬:CSS反爬加密彻底破解!

    刚开始搞爬虫的时候听到有人说爬虫是一场攻坚战 听的时候也没感觉到特别 但是经过了一段时间的练习之后 深以为然 每个网站不一样 每次爬取都是重新开始 所以 爬之前谁都不敢说会有什么结果 前两天 应几个小朋友的邀请 动心思玩了一下大众点评的数据
  • css动画效果之transition(动画过渡效果属性)

  • pandas dataframe 读取 xlsx 文件

    refer to https medium com kasiarachuta reading and writingexcel files in python pandas 8f0da449cc48 dframe pd read excel
  • github代码推送总是失败

    github代码推送问题 因为github仓库代码的推送总是失败 所以改了一个方案采用ssh的方式来进行代码的推送 并记录操作步骤 方案 https方式换成ssh方式 git ssh 生成 假如已经生成的话 可以略过此步骤 ssh keyg
  • Android启动service的方法

    在 Android 中启动 service 的方法如下 创建 service 的类 并在 AndroidManifest xml 文件中注册该 service 使用 Intent 类来启动 service 例如 Intent intent
  • [转]公司管理混乱,从哪里入手?

    案例分析 我们是一个40人左右的小公司 规模虽小 但管理起来感觉力不从心 经常碰到工人抵抗 情绪化 上班迟到 旷工 不服从管理 即使勉强接受 也不会用心去做 草草应付了事 每次都提议是否弄个规章制度 但也是白纸一张 到了月底 实施不了 因为
  • 使用OpenGL 立方体贴图

    openGL系列文章目录 文章目录 openGL系列文章目录 前言 一 OpenGL 立方体贴图 二 使用步骤 1 代码 2 着色器程序 运行结果 注意 源码下载 参考 前言 对于室外3D 场景 通常可以通过在地平线上创造一些逼真的效果 来
  • SpringBoot利用AOP写一个日志管理(Log)

    1 需求 目前有这么个问题 有两个系统CSP和OMS 这俩系统共用的是同一套日志操作 Log 目前想区分下这俩系统的日志操作 那没办法了 只能重写一份Log的日志操作 你也可以参照若依框架的日志系统实现 2 新建一张日志表 sys oper
  • libevent学习篇之一:libevent快速入门

    https www jianshu com p 8ea60a8d3abb LibEvent快速入门 简介 基本的socket变成是阻塞 同步的 每个操作除非已经完成 出错 或者超时才会返回 这样对于每一个请求 要使用一个线程或者单独的进程去
  • 岁月划过生命线(16.02 ~ 10 -提前转正)

    岁月划过生命线 16 02 10 提前转正 标签 coder 10月9号收到了提前转正通知后就想写些总结 总结在微店的一年里见过的人 读过的书 做过的事儿 不然怕很多有意思的细节以后都忘了 但一直找借口迟迟懒得动笔 这篇总结断断续续竟写了一
  • Linux驱动入门必须get的知识点-01.基本框架与操作

    0 编写编译驱动的Makefile 指定驱动的测试的路径 ROOM DIR nfs rootfs home 2 study 指定测试Demo的交叉编译工具链 DEMO DIR home linux 1 DataShare 0 交叉编译工具链
  • Mybatis-Plus代码生成器快速上手示例

    Mybatis Plus代码生成器 实验脚本 Table structure for parent list DROP TABLE IF EXISTS parent list CREATE TABLE parent list p id in
  • Audacity如何改变音频节奏?Audacity调整音频节奏方法

    很多人在录完音频后都会试听效果 经常会发现音频的节奏要么太快 要么太慢 可是自己又不愿意花时间 花人力 物力再去录制音频 为了解决这问题 我们可以用Audacity改变音频的节奏 加快或者减慢某个音频片段或者整个音频的节奏 只是很多人不懂怎
  • Windows 11 & Server 2022 HLK kit WHQL认证注意事项

    微软已经发布Windows 11 Server2022 HLK WHQL 测试套装 针对这一版HLK 有一个地方十分值得注意 在创建Porject的时候会出现 is windows driver Project 选择框 这一选项目前是用于工
  • (小米系统系列一)小米/红米BL解锁,解BL锁方法(亲测可用)

    文章参考自原作者 原作者链接 https www bilibili com read cv3305336 https www xiaomi cn post 17982230 http www miui com unlock download
  • Java Eclipse如何调试代码

    下面通过一个简单的例子来了解一下 Eclipse 调试程序的方法 public class Test1 public static void main String args for循环 如果for后面 内的条件一直成立 内的代码一直执行
  • Pandas基础操作

    Pandas基础 文章目录 Pandas基础 一 Series 二 DataFrame 三 索引值 四 索引和选取 loc和iloc函数讲解 五 行和列的操作 map apply applymap函数讲解 Pandas的函数应用 层级索引
  • 数据结构与算法之快速排序

    package com yg sort author GeQiLin date 2020 2 26 21 00 import java util Arrays public class QuickSort private static in