鱼C论坛

 找回密码
 立即注册
查看: 2780|回复: 1

[技术交流] 快速排序三指针分区法

[复制链接]
发表于 2019-4-6 21:59:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
有相同元素值的快速排序——三分法
三分法有三个指针,一个向右扫描比主元小的元素指针,
一个记录与主元相等元素的指指,另一个是从右向左扫描
比主元大的元素指针。
将数组分为四个区,小于主元区,等于主元区,未知区,
与大于主元区
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-4-6 22:00:09 | 显示全部楼层
#include <iostream>

using namespace std;

void swap(int arr[], int a, int b)
{
    int temp = arr[a];
    arr[a] = arr[b];
    arr[b] = temp;
}

void quick_sort(int arr[], int left, int right)
{
    if(left >= right)
        return;

    int e = left + 1; //记录等于主元的指针
    int sp = left + 1; //扫描小于主元元素指针
    int bigger = right; //扫描大于主元元素指针
    int pivot = arr[left]; //主元
    while(sp <= bigger)
    {
        while(sp <= bigger && arr[sp] < pivot)
        {
            e++;
            sp++;
        }
        while(sp <= bigger && arr[sp] == pivot)
        {
            swap(arr, e, sp);
            e++;
            sp++;
        }
        while(sp <= bigger && arr[bigger] > pivot) 
            bigger--;
        
        if(sp < bigger)
            swap(arr, bigger, sp);
    }
    swap(arr, bigger, left);
    quick_sort(arr, left, bigger-1);
    quick_sort(arr, bigger+1, right);
}

int main()
{
    int arr[10] = {5, 1, 2, 4, 3, 6, 1, 1, 2, 2};
    quick_sort(arr, 0, 9);
    for(int i = 0; i<10; i++)
        cout << arr[i] << "\t";
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 13:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表