日撸 Java 三百行day46

这篇具有很好参考价值的文章主要介绍了日撸 Java 三百行day46。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

说明

闵老师的文章链接: 日撸 Java 三百行(总述)_minfanphd的博客-CSDN博客
自己也把手敲的代码放在了github上维护:https://github.com/fulisha-ok/sampledata

day46 快速排序

1.基本思路

快速排序需要一个基准值,在这个基准值右边的数都比这个基准值,左边的数都比这个基准值。一趟排序就可以确定一个数的最终位置
大致步骤如下:

  • 选择基准值,一般选择数组第一个元素或者最后一个。
  • 从右往左扫描数组,如果找到一个比基准值小的元素,则停止。
  • 从左往右扫描数组,如果找到一个比基准值大的元素,则停止。
  • 交换位置
  • 重复上面的步骤 直到low和high相遇,这是low和high所在位置就是基准元素的最后位置
    递归地对左半部分和右半部分进行快速排序(以下是根据代码思想模拟的一次快速排序结果)
    日撸 Java 三百行day46

2. 代码

  • 快速排序,会在左右两边各设置一个指针low和hight,代码中基准值找的是最右边的数据,当tempLeft遇到比基准值小的就++,否则就会停下来;tempRight遇到比基准值大的就–,否则就会停下;然后交换位置;直到tempLeft和tempRight相遇
  • 每一趟排序后就会有基准值的左右两边,对左右两边又进行同样的快速排序操作操作,所以这个是有递归思想在里面的,用递归算法解决。
 /**
     * Quick sort recursively.
     * @param paraStart The start index.
     * @param paraEnd The end index
     */
    public void quickSortRecursive(int paraStart, int paraEnd) {
        if (paraStart >= paraEnd) {
            return;
        }
        int tempPivot = data[paraEnd].key;
        DataNode tempNodeForSwap;

        int tempLeft = paraStart;
        int tempRight = paraEnd;

        //find the position for the pivot. at the same time move smaller elements to the left and bigger one to the right
        while (true) {
            while ((data[tempLeft].key < tempPivot) && tempLeft < tempRight) {
                tempLeft++;
            }
            while ((data[tempRight].key) > tempPivot && tempLeft < tempRight) {
                tempRight--;
            }

            if (tempLeft < tempRight) {
                //swap
                System.out.println("Swapping " + tempLeft + " and " + tempRight);
                tempNodeForSwap = data[tempLeft];
                data[tempLeft] = data[tempRight];
                data[tempRight] = tempNodeForSwap;
            }else {
                break;
            }

            System.out.print("From " + paraStart + " to " + paraEnd + ": ");
            System.out.println(this);
            quickSortRecursive(paraStart, tempLeft - 1);
            quickSortRecursive(tempLeft + 1, paraEnd);
        }
    }

    public void quickSort() {
        quickSortRecursive(0, length-1);
    }

    /**
     * Test the method.
     */
    public static void quickSortTest() {
        int[] tempUnsortedKeys = { 1, 3, 12, 10, 5, 7, 9 };
        String[] tempContents = { "if", "then", "else", "switch", "case", "for", "while" };
        DataArray tempDataArray = new DataArray(tempUnsortedKeys, tempContents);

        System.out.println(tempDataArray);

        tempDataArray.quickSort();
        System.out.println("Result\r\n" + tempDataArray);
    }

日撸 Java 三百行day46

对比昨天学习的冒泡排序,冒泡排序是从一边开始,并且交换的是相邻两个元素,他也会确定一个最终位置,但是这个最终位置是从下到上依次确定(或从上到下),而快速排序,他也是交换数据,但是他是两边同时开始比较,每次也会确定一个数的最终位置,但是这个位置并不是有规律的,需要结合排序的数据来看,相比冒泡,快速排序的基准值要选好才是关键。文章来源地址https://www.toymoban.com/news/detail-437953.html

到了这里,关于日撸 Java 三百行day46的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法|Day46 动态规划14

    LeetCode 1143- 最长公共子序列 题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 题目描述 :给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串:它是由原

    2024年02月11日
    浏览(44)
  • 算法记录 | Day46 动态规划

    思路: 1.确定dp数组以及下标的含义 dp[i] : 字符串长度为i的话,dp[i]为true,表示可以拆分为一个或多个在字典中出现的单词 。 2.确定递推公式 如果 s[0: j] 可以拆分为单词(即 dp[j] == True ),并且字符串 s[j: i] 出现在字典中,则 dp[i] = True 。 如果 s[0: j] 不可以拆分为单词(即

    2024年02月02日
    浏览(38)
  • Day46- 动态规划part14

    题目一:1143. 最长公共子序列 1143. 最长公共子序列 给定两个字符串  text1  和  text2 ,返回这两个字符串的最长  公共子序列  的长度。如果不存在  公共子序列  ,返回  0  。 一个字符串的  子序列   是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的

    2024年02月21日
    浏览(37)
  • LeetCode 每日一题 Day 46 ||枚举

    给你一个下标从 0 开始的数组 words ,数组中包含 互不相同 的字符串。 如果字符串 words[i] 与字符串 words[j] 满足以下条件,我们称它们可以匹配: 字符串 words[i] 等于 words[j] 的反转字符串。 0 = i j words.length 请你返回数组 words 中的 最大 匹配数目。 注意,每个字符串最多匹配

    2024年01月22日
    浏览(43)
  • Java课设-百行代码实现简易计算器

    Java程序设计 工程实践 ——简易计算器的设计 院、 系 计算机与软件学院 专业 信息安全 姓 名 指导教师 2022年 6 月 11 日 目录: 一、 设计简介 2 1、 设计背景 2 2、 开发工具及环境 2 (1)开发工具及介绍 2 (2)开发环境 2 二、 相关工作 2 1、设计基础 2 2、功能需求 2 3、系统

    2024年02月04日
    浏览(74)
  • 研习代码 day46 | 动态规划——子序列问题2

            1.1 题目         给定两个字符串  text1  和  text2 ,返回这两个字符串的最长  公共子序列  的长度。如果不存在  公共子序列  ,返回  0  。         一个字符串的  子序列   是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下

    2024年02月04日
    浏览(36)
  • Linux shell编程学习笔记46:awk命令的由来、功能、格式、选项说明、版权、版本

    在编写Linux Shell脚本的过程中,我们经常要对Linux命令执行的结果进行分析和提取,Linux也在文本分析和提取这方面提供了不少的命令。比如我们之前研究过的cut命令。 Linux shell编程学习笔记43:cut命令 https://blog.csdn.net/Purpleendurer/article/details/135730679?spm=1001.2014.3001.5501 除了cut命

    2024年04月24日
    浏览(65)
  • Day 46 | 139. Word Break | Backpack Question Summary

    Day 1 | 704. Binary Search | 27. Remove Element | 35. Search Insert Position | 34. First and Last Position of Element in Sorted Array Day 2 | 977. Squares of a Sorted Array | 209. Minimum Size Subarray Sum | 59. Spiral Matrix II Day 3 | 203. Remove Linked List Elements | 707. Design Linked List | 206. Reverse Linked List Day 4 | 24. Swap Nodes in Pairs| 19.

    2024年02月15日
    浏览(35)
  • 【linux】:老师问什么是爱情,我说了句:软硬链接和动静态库

        文章目录 前言 一、软硬链接 二、动态库和静态库 总结   上一篇文章的最后我们讲解了文件的inode,那么文件名和inode有什么区别呢?区别就在于linux系统只认inode号,文件的inode属性中,并不存在文件名,而文件名其实是给用户用的。我们以前讲过linux文件目录,那么目

    2023年04月19日
    浏览(127)
  • java黑马头条 day5自媒体文章审核 敏感词过滤算法DFA 集成RabbitMQ实现自动审核

      做为内容类产品,内容安全非常重要,所以需要进行对自媒体用户发布的文章进行审核以后才能到app端展示给用户。2 WmNews 中 status 代表自媒体文章的状态 status字段:0 草稿 1 待审核 2 审核失败 3 人工审核 4 人工审核通过   8 审核通过(待发布) 9 已发布 当自媒体用户提交

    2024年02月06日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包