3路快速排序(荷兰国旗问题)

3路快速排序(荷兰国旗问题)

在这里,我们将看到快速排序技术,但我们将使用三路快速排序。基本的快速排序技术只是找到一个元素作为枢轴,然后围绕枢轴对数组进行分区,之后,在枢轴的左右子数组上递归。

三路快速排序类似,但有三个部分。数组arr[1到n]被分为三个部分。

arr[1到i]arr[i + 1, j]arr[j + 1, n]

算法

partition(arr, left, right, i, j) −

begin   if right – left <= 1, then      if arr[right] < arr[left], then         swap arr[right] and arr[left]      i := left      j := right      return   end if   mid := left, pivot = arr[right]   while mid <= right, do      if arr[mid] < pivot, then         swap arr[left], arr[mid]         increase left and mid by 1      else if arr[mid] = pivot, then increase mid by 1      else         swap arr[mid], arr[right]         decrease right by 1   done   i := left – 1   j := midend

快速排序(arr,左,右) –

begin   if left >= right, then      return   end if   define i and j   partition(arr, left, right, i, j)   quicksort(arr, left, i)   quicksort(arr, j, right)end

Example

的中文翻译为:

示例

#include#includeusing namespace std;void partition(int arr[], int left, int right, int &i, int &j) {   if (right - left <= 1) {      if (arr[right] < arr[left])         swap(arr[right], arr[left]);      i = left;      j = right;      return;}int mid = left;int pivot = arr[right];while (mid <= right) {   if (arr[mid] pivot)         swap(arr[mid], arr[right--]);   }   i = left-1;   j = mid;}void quicksort(int arr[], int left, int right) {   if (left >= right) //1 or 0 elements      return;   int i, j;   partition(arr, left, right, i, j);   quicksort(arr, left, i);   quicksort(arr, j, right);}void display(int arr[], int n) {   for (int i = 0; i < n; ++i)   cout << " " << arr[i];   cout << endl;}int main() {   int a[] = {4, 9, 4, 3, 1, 9, 4, 3, 9, 4, 3, 1, 4};   int n = sizeof(a) / sizeof(int);   display(a, n);   quicksort(a, 0, n - 1);   display(a, n);}

输出

4 9 4 3 1 9 4 3 9 4 3 1 41 1 3 3 3 4 4 4 4 4 9 9 9

以上就是3路快速排序(荷兰国旗问题)的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1445323.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 22:24:12
下一篇 2025年12月17日 22:24:21

相关推荐

  • C# 快速排序

    c# 快速排序 using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Sort{ class QuickSorter { private static int[] myA…

    2025年12月17日
    000
  • 用Python怎么实现快速排序

    用Python实现快速排序的方法:1、定义一个名为quick_sort的函数,使用递归的方法来实现快速排序;2、检查数组的长度,如果长度小于等于1,则直接返回数组,否则,选择数组中的第一个元素作为枢纽元素(pivot),然后将数组分成比枢纽元素小和比枢纽元素大的两个子数组;3、将这两个子数组和枢纽元…

    2025年12月13日
    000
  • 如何用Python实现快速排序算法?

    如何用Python实现快速排序算法? 快速排序是一种常见而高效的排序算法,它能够在平均情况下以O(n log n)的时间复杂度对一个包含n个元素的列表进行排序。本文将介绍如何使用Python编写快速排序算法的代码示例。 快速排序的基本思想是选取一个元素作为基准(通常选择列表第一个元素),将列表分割成…

    2025年12月13日
    000
  • 如何对PHP数组进行快速排序?

    php中实现快速排序的步骤如下:1.选择数组第一个元素作为基准(pivot)。2.将小于pivot的元素放入$left数组,大于等于pivot的元素放入$right数组。3.递归地对$left和$right进行排序,并将结果合并。快速排序在php中虽然高效,但在数组已部分或完全有序时性能可能退化为o…

    2025年12月10日
    100
  • js如何实现数组快速排序 3种快速排序算法实现方案分享

    %ignore_a_1%是一种基于“分而治之”策略的高效排序算法,其核心是选定一个基准值,将数组分为两部分,使得左边元素小于基准值,右边元素大于基准值,然后递归地对左右子数组排序。文章介绍了三种javascript实现方案:1. lomuto分区方案选择最后一个元素为基准,通过指针i划分边界,优点简…

    2025年12月4日 web前端
    000
  • Java中快速排序的原理 图解快速排序的分治思想实现

    快速排序的核心在于分治思想,通过选取基准值将数组分为两个子数组并递归排序。1. 选择基准值(如首元素、随机或三数取中),2. 分区使小于基准值的在左、大于的在右,3. 递归对左右子数组排序。其平均时间复杂度为o(n log n),但最坏情况下可能退化到o(n^2)。相比其他算法,快速排序效率高且空间…

    2025年10月31日 java
    000

发表回复

登录后才能评论
关注微信