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日

相关文章

  • C语言实现文件内容按行随机排列的算法示例

    下面我将为您详细介绍“C语言实现文件内容按行随机排列的算法示例”的完整攻略。 1、问题描述 首先,这个算法的问题描述是:实现一个按行随机排列文件内容的算法,要求结果能够尽可能地随机、均匀。 2、算法思路 针对这个问题,我们可以采用以下算法思路: 首先读取文件的全部内容,将其中的每一行存在一个字符串数组中; 然后采用洗牌算法(shuffle algorithm…

    算法与数据结构 2023年5月19日
    00
  • Golang实现常见排序算法的示例代码

    请先让我说明一下问题:这个“Golang实现常见排序算法的示例代码”的完整攻略,是一个涉及到编程的复杂主题。虽然我无法在短短的几段话内详细讲解全部内容,但我可以为您提供一些有用的信息,指引你更好地开始学习。 首先,请了解以下这些关键词:算法、排序、函数、结构体、切片。理解它们之间的联系和差异很重要。 接着,学习排序算法分为两个部分:理论和实现。 掌握基本排序…

    算法与数据结构 2023年5月19日
    00
  • C语言对数组元素进行冒泡排序的实现

    冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的数组,每次比较相邻的元素,如果顺序不对就交换元素。通过多次遍历来实现排序。 下面是C语言进行数组元素冒泡排序的具体实现过程: 实现步骤 首先确定要排序的数组以及数组的大小。比如说,我们要对包含10个整数的数组进行排序,可以将其定义为 int a[10] = {1,2,3,4,5,6,…

    算法与数据结构 2023年5月19日
    00
  • C语言实现快速排序算法

    C语言实现快速排序算法攻略 什么是快速排序算法 快速排序算法是一种常用的排序算法, 它使用递归的方式不断地将待排序序列分为两个部分,直到每个子序列中只有一个元素,最终合并完成整个序列的排序。 步骤 快速排序算法的步骤如下: 从序列中选取一个基准元素 将所有小于基准元素的元素放到基准元素左边,大于基准元素的元素放到基准元素右边 对基准元素左右两个子序列分别执行…

    算法与数据结构 2023年5月19日
    00
  • Javascript实现快速排序(Quicksort)的算法详解

    Javascript实现快速排序的算法详解 在这个攻略中,我们将通过Javascript实现快速排序算法,并讲解算法的详细过程。 快速排序的基本思想 快速排序是一种基于交换的排序算法,其基本思想是通过选择一个基准元素,在一趟排序过程中,将之前需要排序的序列中的元素分割成两个部分,其中,左边部分元素的值都小于基准元素的值,右边部分元素的值都大于基准元素的值,然…

    算法与数据结构 2023年5月19日
    00
  • 算法之排序算法的算法思想和使用场景总结

    算法之排序算法的算法思想和使用场景总结 一、引言 排序算法是计算机科学基础中的一个重要的部分。随着数据规模的增大,如何高效地对数据进行排序也成为了计算机科学中的重要问题。各种排序算法针对不同的数据结构和数据规模,具有不同的时间和空间复杂度。通过了解不同的排序算法的算法思想和使用场景,可以帮助我们更好地选择合适的排序算法。 二、排序算法的分类 常见的排序算法可…

    算法与数据结构 2023年5月19日
    00
  • 前端JavaScript多数元素的算法详解

    前端JavaScript多数元素的算法详解 算法介绍 多数元素在一个数组中出现次数超过一半的元素,因此要找到多数元素,需要考虑其出现次数是否超过了数组长度的一半。本文介绍三种常见的多数元素算法,分别为排序法、哈希表法和摩尔投票法。 排序法 排序法的思路是先对数组进行排序,然后返回数组中间的那个元素即可。由于多数元素出现次数超过了数组长度的一半,因此排序后中间…

    算法与数据结构 2023年5月19日
    00
  • JavaScript求解最长回文子串的方法分享

    JS求解最长回文子串的方法分享: 一、前置知识 在学习JS求解最长回文子串之前,你需要掌握以下知识: 严格模式 回文字符串 动态规划 二、什么是回文字符串? 回文字符串是指正着读和倒着读都一样的字符串。例如,’level’、’racecar’、’rotor’ 都是回文字符串。 三、求解最长回文子串的方法 对于字符串中的每一个字符,判断它和它往前的字符组成的子…

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