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排序算法之希尔排序的2个实例

    下面我将详细讲解“JavaScript排序算法之希尔排序的2个实例”的完整攻略。 算法简介 希尔排序(Shell Sort)是插入排序的一种更高效的改进版本,也称为缩小增量排序。它通过在不断缩小步长的序列中对数据进行多轮分组插入排序来进行排序。首先将整个待排序的记录序列分割成为若干个子序列分别进行直接插入排序,待整个序列中的元素基本有序时,再对全体元素进行一…

    算法与数据结构 2023年5月19日
    00
  • 深入了解javascript 数组的sort方法

    深入了解JavaScript数组的sort方法 简介 在JavaScript中,数组(Array)是一个非常常用的数据结构,而sort()是Array原型上的非常常用的方法,可用于排序。数组中的元素可以是任何类型,但在排序时,所有元素都将转换为字符串形式,所以有时打算对不同数据类型的元素进行排序,您可能需要使用自定义比较函数。 基本使用方法 sort()方法…

    算法与数据结构 2023年5月19日
    00
  • 用c语言实现冒泡排序,选择排序,快速排序

    首先我们来讲一下三种基本的排序算法——冒泡排序、选择排序和快速排序,并且给出实现的具体代码。 冒泡排序 冒泡排序是一个非常简单的排序算法,其基本思想是比较相邻两个数的大小,如果前一个数比后一个数大,就将两个数交换位置。通过不断重复这个过程,将最大的数“冒泡”到数组的最后面,这个过程类似于水泡在水中不断冒上来,因此得其名。 具体的实现代码如下: void bu…

    算法与数据结构 2023年5月19日
    00
  • C/C++语言八大排序算法之桶排序全过程示例详解

    C/C++语言八大排序算法之桶排序全过程示例详解 什么是桶排序 桶排序(Bucket Sort)是一种线性排序算法,它的基本思想是将数组内的元素根据某个规则分配到若干个桶中,然后对每个桶内的元素进行排序,最终合并每个桶内的有序元素即可得到原数组的有序结果。 桶排序的主要应用场景是待排序元素的分布比较均匀的情况下,性能表现优于其他排序算法(例如快速排序、归并排…

    算法与数据结构 2023年5月19日
    00
  • php计数排序算法的实现代码(附四个实例代码)

    php计数排序算法的实现代码 是什么? 计数排序是一种线性时间复杂度的排序算法,该算法的核心思想是对每个输入元素统计出小于该元素的元素个数,根据此信息可以直接确定每个元素在排序后数组中的位置。在实现过程中需要开辟一定的内存空间来存储统计的数据。 php计数排序算法的实现代码 的思路是什么? 创建一个计数数组counts,长度为maxValue+1,maxVa…

    算法与数据结构 2023年5月19日
    00
  • C#实现冒泡排序和插入排序算法

    C#实现冒泡排序和插入排序算法 冒泡排序算法 冒泡排序算法是一种基本的排序算法,其基本思想是通过对相邻的元素进行比较和交换,逐渐把待排序的元素交换到相应的位置上。 在C#中,实现冒泡排序非常简单,代码示例如下: public static void BubbleSort(int[] arr) { int len = arr.Length; for (int …

    算法与数据结构 2023年5月19日
    00
  • javascript笛卡尔积算法实现方法

    JavaScript笛卡尔积算法实现方法 什么是笛卡尔积 笛卡尔积是指给定多个集合,每个集合中分别选取一个元素组成的所有可能组合的集合。例如,有两个集合 X={1,2} 和 Y={3,4},那么它们的笛卡尔积为 {(1,3), (1,4), (2,3), (2,4)}。 实现笛卡尔积算法 JavaScript实现笛卡尔积算法的过程可以分为以下三步: 遍历所有…

    算法与数据结构 2023年5月19日
    00
  • C++实现归并排序

    C++实现归并排序 什么是归并排序 归并排序是一种分治策略的排序算法,将待排序的序列切分为若干个子序列,递归地对子序列排序,并将各子序列的排序结果合并成最终有序序列。归并排序的时间复杂度为O(nlogn),是一种高效的排序算法。 归并排序的实现 递归实现 归并排序的递归实现比较容易理解。我们可以将待排序的序列不断切分为更小的子序列,直到子序列长度为1,此时子…

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