鱼C论坛

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

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

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

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

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

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

使用道具 举报

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

  2. using namespace std;

  3. void swap(int arr[], int a, int b)
  4. {
  5.     int temp = arr[a];
  6.     arr[a] = arr[b];
  7.     arr[b] = temp;
  8. }

  9. void quick_sort(int arr[], int left, int right)
  10. {
  11.     if(left >= right)
  12.         return;

  13.     int e = left + 1; //记录等于主元的指针
  14.     int sp = left + 1; //扫描小于主元元素指针
  15.     int bigger = right; //扫描大于主元元素指针
  16.     int pivot = arr[left]; //主元
  17.     while(sp <= bigger)
  18.     {
  19.         while(sp <= bigger && arr[sp] < pivot)
  20.         {
  21.             e++;
  22.             sp++;
  23.         }
  24.         while(sp <= bigger && arr[sp] == pivot)
  25.         {
  26.             swap(arr, e, sp);
  27.             e++;
  28.             sp++;
  29.         }
  30.         while(sp <= bigger && arr[bigger] > pivot)
  31.             bigger--;
  32.         
  33.         if(sp < bigger)
  34.             swap(arr, bigger, sp);
  35.     }
  36.     swap(arr, bigger, left);
  37.     quick_sort(arr, left, bigger-1);
  38.     quick_sort(arr, bigger+1, right);
  39. }

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 02:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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