【排序算法】快速排序的基本算法

这篇具有很好参考价值的文章主要介绍了【排序算法】快速排序的基本算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        快速排序是应用最广泛的排序算法,流行的原因是它实现简单,适用于各种不同的输入数据且在一般应用中比其他排序算法都要快得多。快速排序引人注目的特点是原地排序,只需要一个很小的辅助栈,且将长度为N的数组排序所需时间和NlgN成正比。另外,快速排序的内循环比其他大多数排序算法都要短小。它的主要缺点是非常脆弱,在实现时需要非常小心才能避免低劣的性能。

        快速排序是一种分治的排序算法。它将一个数组分为两个子数组,将两部分单独排序。快速排序和归并排序是互补的:归并排序将数组分为两个子数组分别排序,并将有序的子数组归并以将整个数组排序;而快速排序将数组排序的方式则是当两个子数组都有序时整个数组也就有序了。

        在快速排序中,切分的位置取决于数组的内容。

        快速排序的关键在于切分,切分过程使得数组满足一下三个条件:

        1、对于某个j,a[j]已经排定

        2、a[lo]到a[j-1]中所有元素都不大于a[j]

        3、a[j+1]到a[hi]中所有元素都不小于a[j]

        通过递归地调用切分来排序。

        算法的实现:

import java.util.Arrays;
import java.util.Collections;
public class Quick {
    private static int partition(int[] a,int lo,int hi)
    {
        int i=lo,j=hi+1;
        int v=a[lo];
        while (true)
        {
            while (a[++i]<v)if(i==hi) break;
            while (v<a[--j])if(j==lo) break;
            if (i>=j) break;
            list_deal.exch(a,i,j);
            list_deal.printArray(a);
        }
        list_deal.exch(a,lo,j);
        list_deal.printArray(a);
        return j;
    }
    private static void sort(int[] a,int lo,int hi)
    {
        if (hi<=lo) return;
        int j=partition(a,lo,hi);
        sort(a,lo,j-1);
        sort(a,j+1,hi);
    }
    public static void sort(int[] a)
    {
        list_deal.randomshuffle(a);
        list_deal.printArray(a);
        sort(a,0,a.length-1);
    }
    public static void main(String[] args) {
        int[] a={534,745,264,864,136,967,254,746,734,269,538,265,825,158,139,100};
        sort(a);
        list_deal.printArray(a);
    }
}

排序过程(因为有随机排序,所以每次执行的过程可能都不一样):

158 734 100 534 967 864 825 746 136 139 264 269 745 265 254 538 
158 139 100 534 967 864 825 746 136 734 264 269 745 265 254 538 
158 139 100 136 967 864 825 746 534 734 264 269 745 265 254 538 
136 139 100 158 967 864 825 746 534 734 264 269 745 265 254 538 
136 100 139 158 967 864 825 746 534 734 264 269 745 265 254 538 
100 136 139 158 967 864 825 746 534 734 264 269 745 265 254 538 
100 136 139 158 538 864 825 746 534 734 264 269 745 265 254 967 
100 136 139 158 538 254 825 746 534 734 264 269 745 265 864 967 
100 136 139 158 538 254 265 746 534 734 264 269 745 825 864 967 
100 136 139 158 538 254 265 269 534 734 264 746 745 825 864 967 
100 136 139 158 538 254 265 269 534 264 734 746 745 825 864 967 
100 136 139 158 264 254 265 269 534 538 734 746 745 825 864 967 
100 136 139 158 254 264 265 269 534 538 734 746 745 825 864 967 
100 136 139 158 254 264 265 269 534 538 734 746 745 825 864 967 
100 136 139 158 254 264 265 269 534 538 734 746 745 825 864 967 
100 136 139 158 254 264 265 269 534 538 734 746 745 825 864 967 
100 136 139 158 254 264 265 269 534 538 734 745 746 825 864 967 
100 136 139 158 254 264 265 269 534 538 734 745 746 825 864 967 
100 136 139 158 254 264 265 269 534 538 734 745 746 825 864 967 

快速排序算法需要注意的点:

1、原地切分:如果使用一个辅助数组,很容易实现切分,但将切分后的数组复制回去的开销很大。

2、别越界:如果切分元素是数组中最大或最小的元素,需要小心别让扫描指针跑出数组的边界。

3、保持随机性:数组元素的顺序是被随机打乱的,这对预测算法的运行时间很重要

4、终止循环:正确的检测指针是否越界需要一些技巧

5、处理切分元素时需要注意有重复的情况

6、终止递归地方法。文章来源地址https://www.toymoban.com/news/detail-814544.html

到了这里,关于【排序算法】快速排序的基本算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【数据结构与算法】:选择排序与快速排序

    🔥 个人主页 : Quitecoder 🔥 专栏 :数据结构与算法 我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:腾讯云 欢迎来到排序的第二个部分:选择排序与快速排序! 选择排序是一种简单直观的比较排序算法。该算法的基本思想是在每一轮中选出当前未排序部分的最

    2024年03月17日
    浏览(41)
  • 数据结构与算法之快速排序

    快速排序 (Quick Sort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数

    2024年02月10日
    浏览(34)
  • 【数据结构】排序算法(二)—>冒泡排序、快速排序、归并排序、计数排序

    👀 樊梓慕: 个人主页  🎥 个人专栏: 《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》 🌝 每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.冒泡排序 2.快速排序 2.1Hoare版 2.2占坑版 2.3前后指针版 2.4三数取中对快速排序的优化 2.5非递归版 3.归

    2024年02月08日
    浏览(35)
  • 【数据结构与算法】:非递归实现快速排序、归并排序

    🔥 个人主页 : Quitecoder 🔥 专栏 :数据结构与算法 上篇文章我们详细讲解了递归版本的快速排序,本篇我们来探究非递归实现快速排序和归并排序 快速排序的非递归实现主要依赖于栈(stack)来模拟递归过程中的函数调用栈。递归版本的快速排序通过递归调用自身来处理子

    2024年03月24日
    浏览(44)
  • 【数据结构与算法】如何对快速排序进行细节优化以及实现非递归版本的快速排序?

    君兮_的个人主页 即使走的再远,也勿忘启程时的初心 C/C++ 游戏开发 Hello,米娜桑们,这里是君兮_,国庆长假结束了,无论是工作还是学习都该回到正轨上来了,从今天开始恢复正常的更新频率,今天为大家带来的内容是快速排序的两大优化和非递归实现 好了废话不多说,开

    2024年02月08日
    浏览(37)
  • Java 与数据结构(6):快速排序

    ChatGPT 中文指南(大全) 内容包含:如何开通chatgpt、chatgpt的同类站点、prompts 、AI绘图、ChatGPT 工具、相关报告论文、ChatGPT应用项目等 链接:ChatGPT 中文指南(大全) 指令指南,精选资源清单,更好的使用 chatGPT 让你的生产力up up up! 快速排序(Quick Sort)是一种基于分治思想的排序

    2024年02月07日
    浏览(32)
  • 【数据结构与算法】快速排序的三种实现方法

      目录 一.基本思想 二.Hoare法 动态演示 三.挖坑法 动态演示 四.前后指针法 动态演示 五.快速排序优化 随机下标交换法 三路取中法 六.快速排序的特性 任取待排序元素序列中的某元素作为 基准值 ,按照该排序码将待排序集合 分割成两子序列 , 左子序列中所有元素均小于基

    2023年04月09日
    浏览(48)
  • 【数据结构与算法】快速排序的非递归实现方法

      目录 一.前言 二.非递归实现 如果数据量过大的话,不断递归就会出现 栈溢出 的现象,这个时候你的代码是没问题的,但就是跑不起来,这个时候就要 把递归改成非递归 。 一般有两种改法: 1.直接改,利用循环等; 2.借助栈的辅助。 而快速排序的非递归实现方法就需要

    2023年04月17日
    浏览(41)
  • 【数据结构】详解七大排序算法(直接插入排序、希尔排序、直接选择排序、堆排序、冒泡排序、快速排序)

    1、基本思想    把待排序的数按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所以的记录插入完为止,得到一个新的有序序列。    实际中我们玩扑克牌时,就用到了插入排序的思想 基本步骤:    当插入第i个元素时,前面的arr[0]、arr[2]…arr

    2024年02月04日
    浏览(51)
  • 数据结构和算法——快速排序(算法概述、选主元、子集划分、小规模数据的处理、算法实现)

    目录 算法概述 图示 伪代码 选主元 子集划分 小规模数据的处理 算法实现 快速排序和归并排序有一些相似,都是用到了分而治之的思想:   通过初步的认识,我们能够知道快速排序算法最好的情况应该是: 每次都正好中分 ,即每次选主元都为元素的中位数的位置。 最好情

    2024年02月15日
    浏览(31)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包