快速排序的三种实现方法

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

  1. 快速排序的单趟排序

快速排序的单趟排序:是以一个数作为基准值,实现将数组中比基准数小的数放在基准值的左侧,比基准值大的数放在基准值的右侧。

方法一:霍尔法

霍尔法的由来:霍尔是一个人的名字,他是最初发现快速排序的人,所以,它使用的单趟排序算法被称为霍尔法。

1.基本思路:

​ 用key标记基准值的下标(数组下标0的元素),使用两个指针left和right分别指向待排数组的最左侧和最右侧,right指针找比key基准值小的数,left指针找比key基准值大的数,找到后将两个数交换位置,同时实现大数右移和小数左移,直到left与right相遇则排序完成,最后将key基准值的下标返回,就完成了单趟排序。

package LiKou;

public class QuickSort {
    public static void main(String[] args) {
        int[] arr = {10,7,2,4,7,62,3,4,2,1,8,9,19};
        quickSort(arr,0,arr.length-1);
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
    public static void quickSort(int[] arr,int low,int high){
        int i,j,temp,t;
        if(low>high){
            return;
        }
        i=low;
        j=high;
        //temp就是基准位        temp = arr[low];

        while (i<j) {
            //先看右边,依次往左递减            
            while (temp<=arr[j]&&i<j) {
                j--;
            }
            //再看左边,依次往右递增            
            while (temp>=arr[i]&&i<j) {
                i++;
            }
            //如果满足条件则交换            
            if (i<j) {
                t = arr[j];
                arr[j] = arr[i];
                arr[i] = t;
            }
        }
        //最后将基准为与i和j相等位置的数字交换        
        arr[low] = arr[i];
        arr[i] = temp;
        //递归调用左半数组        
        quickSort(arr, low, j-1);
        //递归调用右半数组        
        quickSort(arr, j+1, high);
    }
}

方法二:挖坑法1.基本思路:挖坑法是将key基准值用变量单独保存,然后将key的位置空出来形成一个坑,left和right指针分别从左右两端向中心遍历,此时left先指向这个坑,从右边先开始,right找比key小的数,找到后将该数直接放进坑里,并将自己空出来的位置设置为坑,left找比key大的数,找到后将该数放进坑里,并将现在空出来的位置设置为坑,一直遍历,直到left与right相遇,相遇位置一定为坑(left和right必定有一个指向坑),此时将key基准值放进坑内,并返回基准值下标完成单趟排序。

package LiKou;

public class QuickSort2 {
    public static void main(String[] args) {
        int[] arr = {10,7,2,4,7,62,3,4,2,1,8,9,19};
        Quick3(arr,0,arr.length-1);
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
    public static void Quick2(int[] arr,int left,int right){
        if(left>right){
            return;
        }
        int key=arr[left];
        int pre=left;
        int cur=left+1;
        while(cur<=right){
            if(arr[cur]<=key && ++pre!=cur){
                int temp=arr[cur];
                arr[cur]=arr[pre];
                arr[pre]=temp;
            }
            cur++;
        }
        int temp=arr[left];
        arr[left]=arr[pre];
        arr[pre]=temp;
        Quick2(arr,pre+1,right);
        Quick2(arr,left,pre-1);
    }
    public static void Quick3(int[] arr,int left,int right){
        if(left>=right){
            return;
        }
        int key=arr[left];
        int i=left;
        int j=right;
        while(i<j){
            while(j>i && arr[j]>=key){
                j--;
            }
            if(j>i){
                arr[i]=arr[j];
            }
            while(i<j && arr[i]<=key){
                i++;
            }
            if(j>i){
                arr[j]=arr[i];
            }
        }
        arr[i]=key;
        Quick3(arr,left,i-1);
        Quick3(arr,i+1,right);
    }
}

方法三:前后指针法

1.基本思路:

(1) 用key保存数组第一个元素作为基准值,定义前指针prev指向第一个数,后指针cur指向前指针的后一个位置。

(2) 由cur挨个遍历数组中的数据,如果cur寻找比key基准值小的数,则prev后移一个位置,并且交换cur和prev所对应的元素值,cur和prev位置不变。

(3) 依次类推直到cur完全遍历完数组,停止。

prev之前的值一定小于key基准值,而prev与cur之间的一定大于基准值

最后将prev处与key位置的元素交换,将基准值下标返回(此时基准值下标已经交换到prev位置)。则完成单趟排序。文章来源地址https://www.toymoban.com/news/detail-823606.html

package LiKou;

public class QuickSort2 {
    public static void main(String[] args) {
        int[] arr = {10,7,2,4,7,62,3,4,2,1,8,9,19};
        Quick2(arr,0,arr.length-1);
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
    public static void Quick2(int[] arr,int left,int right){
        if(left>right){
            return;
        }
        int key=arr[left];
        int pre=left;
        int cur=left+1;
        while(cur<=right){
            if(arr[cur]<=key && ++pre!=cur){
                int temp=arr[cur];
                arr[cur]=arr[pre];
                arr[pre]=temp;
            }
            cur++;
        }
        int temp=arr[left];
        arr[left]=arr[pre];
        arr[pre]=temp;
        Quick2(arr,pre+1,right);
        Quick2(arr,left,pre-1);
    }
}

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

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

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

相关文章

  • Java 七大排序之快速排序(三种方法包含优化方法)

    任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。 1)  挖坑法 划分完之后,再左右递归。

    2024年02月09日
    浏览(41)
  • 快速排序(三种方法实现)

    (1)思想 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该

    2024年02月04日
    浏览(35)
  • C++ vector逆序排序的三种方法

    突然忘了快速逆序的方法,在网上搜索vector逆序发现没有,于是自己写一下,帮助大家快速查找。 假如你有一个vector里面有元素1,2,3,4,5,则逆序方法如下。 方法一: 方法一比方法二方便。 方法二: 方法三: 方法四(推荐): 你也可以通过使用rbegin,rend指针逆序排序

    2024年02月17日
    浏览(48)
  • 时间复杂度接近O(n)的三种排序算法

    桶排序,顾名思义,会用到“桶”,核心思想是将要排序的数据分到几个有 序的桶里,每个桶内的数据再单独进行排序。桶内排完序之后,再把每个桶内的数据按照顺序依次 取出,组成的序列就是有序的了。 桶排序对要排序数据的要求是非常苛刻的。 首先,要排序的数据需

    2024年02月14日
    浏览(44)
  • 排序算法 - 快速排序(4种方法实现)

    本篇文章的源代码在这,需要自取:Gitee 快速排序是一种常见的排序算法,其基本原理是分治和递归。它的基本思路是,在数组中选择一个元素作为基准值,然后将数组中小于基准值的元素移动到它的左边,大于基准值的元素移动到它的右边。然后对左右两个子数组递归地重

    2024年02月04日
    浏览(41)
  • 成为一个合格程序员所必备的三种常见LeetCode排序算法

    排序算法是一种通过特定的算法因式将一组或多组数据按照既定模式进行重新排序的方法。通过排序,我们可以得到一个新的序列,该序列遵循一定的规则并展现出一定的规律。经过排序处理后的数据可以更方便地进行筛选和计算,从而大大提高了计算效率。因此,掌握排序

    2024年01月17日
    浏览(50)
  • java8 列表通过 stream流 根据对象属性去重的三种实现方法

    0、User对象 1、使用filter进行去重 测试 ①、疑惑 既然 filter 里面调用的是 distinctPredicate 方法,而该方法每次都 new 一个新的 map 对象,那么 map 就是新的,怎么能做到可以过滤呢 ②、解惑 先看一下 filter 的部分实现逻辑,他使用了函数式接口 Predicate ,每次调用filter时,会使用

    2024年01月20日
    浏览(108)
  • Linux批量快速修改文件名的三种方法

    在Linux中, 批量重命名文件 是一项常见且有用的操作。以下是三种常用的批量重命名文件的方法,每种方法都附有示例。这些方法既可以适用于新手,也适用于更有经验的用户。 话不多说,直接上干货! rename 命令 rename命令是一种强大的批量重命名工具,它支持使用正则表

    2024年04月11日
    浏览(64)
  • 排序算法:快速排序(三种排序方式、递归和非递归)

    朋友们、伙计们,我们又见面了,本期来给大家解读一下有关排序算法的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏: C语言:从入门到精通 数据结构专栏: 数据结构 个  人  主  页 : stackY、 目录 前言: 1.快速排

    2024年02月09日
    浏览(39)
  • 【数据结构】稀疏矩阵存储的三种方法及三元组表示稀疏矩阵转置算法的两种实现 —— C++

    1. 三元组顺序表数据结构 注意:data[]中的元素是按行存储或者按列存储的,所以 在将三元组逆置时,不能简单地将行列下标对换,data[]数组中元素的顺序也需要重新排列 2. 三元组表示稀疏矩阵转置算法1 3. 三元组表示稀疏矩阵转置算法2:快速转置 为了 便于随机存取任意一

    2024年02月05日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包