C/C++实现三路快速排序算法原理

C/C++实现三路快速排序算法原理

算法概述

三路快速排序算法是一种优化版本的快速排序算法,能够处理含有大量重复元素的数组,避免了快速排序中大量递归处理相等元素的繁琐工作。

三路快速排序的原理是采用三个指针将数组分成小于、等于和大于三个部分,递归地向下快速排序,最终将整个数组排序。

实现步骤

  1. 首先选取数组中的一个元素作为标志物,通常是数组的第一个元素。
  2. 定义三个指针,分别指向数组的最左端、最右端和标志物的位置。
  3. 将数组分成三个部分,小于标志物、等于标志物和大于标志物。
  4. 递归处理小于和大于标志物的部分。
  5. 重复步骤2到4,直到数组已经排好序。

例子说明

示例1

假设有一个数组:[5, 4, 8, 4, 3, 9, 1, 3, 2, 7],现在需要对它进行三路快速排序。

  1. 选取5作为标志物。
  2. 定义三个指针,分别指向数组的最左端、最右端和标志物位置。指针分别是:left = 0,right = 9,mid = 0。
  3. 从第二个元素开始扫描直到右端,将小于5的元素移到数组左侧,大于5的元素移到数组右侧,相等的元素留在中间。完成后数组变成:[4, 4, 3, 1, 3, 2, 5, 8, 9, 7]。此时指针mid指向最后一个小于5的元素位置,即3的位置。
  4. 分别递归处理左半部分和右半部分,即[4, 4, 3, 1, 3, 2]和[8, 9, 7]。对左半部分重复步骤2到4,对右半部分同样重复处理,直到数组已经排好序。

示例2

再来看一个稍微复杂一点的例子:[9, 10, 51, 1, 13, 51, 43, 13, 10]。

  1. 选取9作为标志物。
  2. 定义三个指针,分别指向数组的最左端、最右端和标志物位置。指针分别是:left = 0,right = 8,mid = 0。
  3. 从第二个元素开始扫描直到右端,将小于9的元素移到数组左侧,大于9的元素移到数组右侧,相等的元素留在中间。完成后数组变成:[1, 9, 13, 43, 51, 51, 13, 10, 10]。此时指针mid指向最后一个小于9的元素位置,即1的位置。
  4. 分别递归处理左半部分和右半部分,即[1, 9, 13, 43]和[51, 51, 13, 10, 10]。对左半部分重复步骤2到4,对右半部分同样重复处理,直到数组已经排好序。

实现代码

C语言实现代码:

void quickSort(int* nums, int left, int right){
    if (left>=right) return;
    int i=left+1, lt=left, gt=right;
    int temp=nums[left];
    while (i<=gt){
        if (nums[i]<temp)
            swap(nums[i++], nums[lt++]);
        else if (nums[i]>temp)
            swap(nums[i], nums[gt--]);
        else
            i++;
    }
    quickSort(nums, left, lt-1);
    quickSort(nums, gt+1, right);
}

C++实现代码:

void quickSort(vector<int>& nums, int left, int right){
    if (left>=right) return;
    int i=left+1, lt=left, gt=right;
    int temp=nums[left];
    while (i<=gt){
        if (nums[i]<temp)
            swap(nums[i++], nums[lt++]);
        else if (nums[i]>temp)
            swap(nums[i], nums[gt--]);
        else
            i++;
    }
    quickSort(nums, left, lt-1);
    quickSort(nums, gt+1, right);
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C/C++实现三路快速排序算法原理 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • JavaScript实现基础排序算法的示例详解

    JavaScript实现基础排序算法的示例详解 排序算法可以说是计算机科学中最基础的算法之一。而对于前端开发者来说,掌握一些简单的排序算法是很有必要的,因为它们可以帮助我们解决很多实际问题,如搜索结果排序、排名等。在这里,我们将讲解JavaScript如何实现基础排序算法。 冒泡排序 冒泡排序是最简单的排序算法之一。它将数组中的元素两两比较,如果顺序不正确就…

    算法与数据结构 2023年5月19日
    00
  • Java中的数组排序方式(快速排序、冒泡排序、选择排序)

    下面是Java中的数组排序方式的完整攻略。 1. 快速排序 快速排序是常用的一种排序算法,其时间复杂度为O(nlogn)。其基本思想是选择一个基准数,将数组分成左右两部分,比基准数小的放在左边,比基准数大的放在右边,然后再对左右两部分分别递归地进行快速排序。 Java中快速排序的实现基于Arrays类的sort方法。下面是一个示例代码: public sta…

    算法与数据结构 2023年5月19日
    00
  • JavaScript中的冒泡排序法

    JavaScript中的冒泡排序法 冒泡排序法就是通过比较任意两个相邻的元素,然后循环遍历整个数组,逐步将最大(或最小)的数移到最后一位。当没有相邻的元素需要互换位置的时候即可完成排序。冒泡排序法是常用的简单排序算法,虽然时间复杂度比高级算法如快速排序、堆排序等要高,但是对于小的数据集合,其性能表现要好于其他排序算法。 以下是冒泡排序法的具体实现: func…

    算法与数据结构 2023年5月19日
    00
  • Lua中写排序算法实例(选择排序算法)

    让我为您详细讲解一下Lua中写排序算法实例(选择排序算法)的完整攻略。 什么是选择排序算法 选择排序是一种简单直观的排序算法,它的工作原理如下: 在待排序的数组中找到最小元素; 将其存放到数组的起始位置; 在剩余未排序的元素中继续寻找最小值,并放到已排序序列的末尾; 重复步骤3,直到待排序序列中的所有元素均已排序完毕。 选择排序的实现思路简单,但由于每次都要…

    算法与数据结构 2023年5月19日
    00
  • JavaScript中的排序算法代码

    JavaScript中的排序算法是基于不同的算法实现的,主要包括冒泡排序、插入排序、选择排序、快速排序、归并排序等。下面我们会分别讲解这些算法的具体实现过程,其中包括每个算法的时间复杂度、空间复杂度、优缺点以及关键代码实现。 冒泡排序 冒泡排序是一种交换排序算法,其基本思想是重复地从序列中比较相邻的两个元素,一遍遍地交换相邻逆序的元素。在一趟排序中如果没有进…

    算法与数据结构 2023年5月19日
    00
  • PHP面试常用算法(推荐)

    对于“PHP面试常用算法(推荐)”这一话题,我可以给出一个较为完整的攻略,如下: PHP面试常用算法(推荐) 1.算法的定义 算法(Algorithm)是指解决问题的方法和步骤,也就是解决问题的具体步骤和策略。算法包括很多种,比如常见的排序算法、查找算法、递归算法等等。在 PHP 的面试中,算法是一个非常重要的考察内容,因此熟练掌握各种算法的基本原理和实现方…

    算法与数据结构 2023年5月19日
    00
  • c语言实现基数排序解析及代码示例

    c语言实现基数排序解析及代码示例 前言 基数排序是一种特殊的排序算法,它的时间复杂度为O(dn),其中d表示数据位数,n表示数据个数。它可以用于排序整数、字符串、链表等数据类型。本篇攻略通过讲解基数排序的原理、流程和C语言实现,希望能够帮助大家更好地理解和应用基数排序算法。 基数排序原理 基数排序是一种非比较排序算法,它的实现基于按照键值的每位数字对待排序数…

    算法与数据结构 2023年5月19日
    00
  • Python实现的最近最少使用算法

    Python实现最近最少使用算法 最近最少使用算法(Least Recently Used,LRU)是一种缓存淘汰策略,用于在缓存已满时选择要被淘汰的缓存块。该算法的基本思想是,当缓存已满时,淘汰最近最少使用的缓存块。 下面我们将通过python代码实现LRU算法的主要思想,并提供两个示例说明。 算法思路 LRU算法需要同时维护两个数据结构。 记录最近访问顺…

    算法与数据结构 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部