java排序算法之快速排序

news/2024/5/19 21:29:05 标签: 算法, 快速排序, java, 排序算法

快速排序算法的原理就不多重复了,大家可以看一下别的博主的原理,我来说几个关键字:双指针,哨兵

代码

import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;

public class QuickSort {

    @Test
    public void test(){
        ArrayList<Integer> input=new ArrayList<Integer>();
        input.add(5);
        input.add(2);
        input.add(9);
        input.add(9);
        input.add(7);
        input.add(13);
        input.add(10);
        input.add(88);

        int[] arr = input.stream().mapToInt((Integer i)->i).toArray();
        System.out.println("排序前数组"+ Arrays.toString(arr));
        quickSort(arr, 0, arr.length - 1);
        System.out.println();
        System.out.println("排序后:"+ Arrays.toString(arr));
//        for (int i : arr) {
//            System.out.print(i+" ");
//        }

    }

    private static void quickSort(int[] arr, int low, int high) {

        if (low < high) {
            // 找寻基准数据的正确索引
            int index = getIndex(arr, low, high);

            // 进行迭代对index之前和之后的数组进行相同的操作使整个数组变成有序
            //quickSort(arr, 0, index - 1); 之前的版本,这种姿势有很大的性能问题,谢谢大家的建议
            quickSort(arr, low, index - 1);
            quickSort(arr, index + 1, high);
        }

    }

    private static int getIndex(int[] arr, int low, int high) {
        // 基准数据
        int tmp = arr[low];
        while (low < high) {
            // 当队尾的元素大于等于基准数据时,向前挪动high指针
            while (low < high && arr[high] >= tmp) {
                high--;
            }
            // 如果队尾元素小于tmp了,需要将其赋值给low
            arr[low] = arr[high];
            // 当队首元素小于等于tmp时,向前挪动low指针
            while (low < high && arr[low] <= tmp) {
                low++;
            }
            // 当队首元素大于tmp时,需要将其赋值给high
            arr[high] = arr[low];

        }
        // 跳出循环时low和high相等,此时的low或high就是tmp的正确索引位置
        // 由原理部分可以很清楚的知道low位置的值并不是tmp,所以需要将tmp赋值给arr[low]
        arr[low] = tmp;
        return low; // 返回tmp的正确位置
    }
}

运行结果
在这里插入图片描述


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

相关文章

access字段属性设置下拉列表_基础表单标签及属性

表单标签一.一个完整的表单包含三个基本组成部分&#xff1a;(表单标签、表单域、表单按钮) ​ 1.表单标签&#xff1a;form标签&#xff0c;用于设置服务器地址、请求方式等等 ​ 2.表单域&#xff1a;用户需要填写或选择的数据&#xff0c;输入框、单选框、复选框、下拉列表等…

java排序之堆排序

从大到小排&#xff1a;构造大顶堆&#xff0c;不交换根节点和末尾节点 package cn.itcast.test.sort;import org.junit.Test;import java.util.Arrays;public class HeapSort {public static void heapSort(int[] arr) {if (arr null || arr.length 0) {return;}int len a…

苹果系统 python闪退怎么解决_双击py文件闪退怎么办_py文件打开闪退的解决方法...

Python文件是以.py为后缀的文件&#xff0c;可以用Python直接运行&#xff0c;但是有的朋友会发现&#xff0c;Python文件打不开了&#xff0c;点击闪退。那么双击py文件闪退怎么办呢&#xff1f;别急&#xff0c;小编现在就为大家带来py文件打开闪退的解决方法。 py文件打开闪…

@Resource与@Autowired用法区别

这个链接讲的非常清楚&#xff0c;大家可以参考一下 https://blog.csdn.net/magi1201/article/details/82590106?utm_mediumdistribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&dist_request_ideaccbb45-ead5-41f8-afec-7664d937bfcb&…

springboot controller访问不到_springboot学习笔记

Spring Boot 微框架(2020版)1. springboot的引言Spring Boot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化Spring应用的 初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不 再需要定义样板化的配置。通过这种方式&#x…

! [rejected] master -> master (fetch first)问题的解决方案

今天在做git push时出现了一下问题 我感觉可能是版本不一致的原因&#xff0c;在这里给大家三种解决方案 方法一&#xff1a; 1、通过git pull 先将本地库更新到与远程库一致的版本&#xff0c;但要注意本地库后来做的修改可能被覆盖&#xff0c;最好使用git fetch(不会自动合…

html静态登录界面代码_如何快速搭建静态网站

“ 在日常运用场景中&#xff0c;由于便捷、低开发成本&#xff0c;静态网站常被作为快速建站的一个备选方案&#xff0c;它可以满足许多内容相对固定的网站建站需求&#xff0c;例如企业官网(介绍、产品展示等)、个人简历网站等。因为内容不常更新&#xff0c;所以可以不带管理…

java中字符串,数组,ArrayList的相互转换

最近写java算法程序时总是用到字符串&#xff0c;数组&#xff0c;ArrayList的相互转换&#xff0c;下面直接上代码了&#xff0c;全部都在代码中注释好了。大家感兴趣可以自己查看。 package cn.itcast.test;import org.junit.Test;import java.util.ArrayList; import java.…