• 数据结构—快速排序(续)


    引言:在上一篇中我们详细介绍了快速排序和改进,并给出了其中的一种实现方式-挖坑法

    但其实快速排序有多种实现方式,这篇文章再来介绍其中的另外两种-左右指针法和前后指针法。有了上一篇挖坑法的启示,下面的两种实现会容易许多。

     一、左右指针法

     首先进行“三数取中”

     

     

    这样就完成了比4小的在左边,比4大的在右边。

    就继续递归就好了。

    下面是代码:

    1. int mid_quick_number(int* arry, int left, int right) {
    2. int mid = left + (right - left >> 1);//去中间数防止普通求中间数溢出问题,
    3. //同时注意优先级,+ -的优先级高于》《
    4. if (arry[mid] > arry[left]) {
    5. if (arry[right] > arry[mid]) {
    6. mid = mid;
    7. }
    8. else if(arry[right]>arry[left]){
    9. mid = right;
    10. }
    11. else {
    12. mid = left;
    13. }
    14. }
    15. else {
    16. if (arry[right] < arry[mid]) {
    17. mid = mid;
    18. }
    19. else if (arry[right] > arry[left]) {
    20. mid = left;
    21. }
    22. else {
    23. mid = right;
    24. }
    25. }
    26. return mid;
    27. }
    28. //左右指针法
    29. void dfs_quick_sort2(int* arry, int left, int right) {
    30. if ((right - left) <= 0)return;
    31. int mid = mid_quick_number(arry, left, right);
    32. swap(arry + mid, arry + left);
    33. int key = arry[left];
    34. int start = left;
    35. int end = right;
    36. while (start < end) {
    37. while (start < end && key <= arry[end]) {
    38. end--;
    39. }//右指针去找比key小的,停下
    40. while (start < end && key >= arry[start]) {
    41. start++;
    42. }//左指针去找大的,停下
    43. swap(arry + start, arry + end);//交换大的和小的
    44. }
    45. swap(arry + end, arry+left);//最后两个指针重合,将key与right或左的值交换
    46. dfs_quick_sort2(arry, left, start - 1);
    47. dfs_quick_sort2(arry, start + 1, right);
    48. }

    二、前后指针法

     

     

    这样就可以把它拆分成两段,在对这两段进行递归即可。

     下面来看代码:

    1. //前后指针法
    2. void dfs_quick_sort3(int* arry, int left, int right) {
    3. if ((right - left) <= 0)return;
    4. int mid = mid_quick_number(arry, left, right);
    5. swap(arry + mid, arry + left);
    6. int key = arry[left];
    7. int cur = left;
    8. int pre = left - 1;
    9. while (cur <= right) {
    10. while (cur <= right && arry[cur] >= key) {
    11. cur++;
    12. }
    13. if (cur <= right) {
    14. pre++;
    15. swap(arry + cur, arry + pre);
    16. }
    17. }
    18. if (pre == left-1)pre++;
    19. dfs_quick_sort3(arry, left, pre);
    20. dfs_quick_sort3(arry, pre + 1, cur - 1);
    21. }

    好了,这是本篇文章的所有内容了,希望对你有所帮助!

  • 相关阅读:
    剑指 Offer II 048. 序列化与反序列化二叉树
    霍尔效应测试系统的构成部分及其主要特征
    1.2 基本分类
    51单片机 数码管操作
    excel封装和ddt D17
    写一个简易的spring包含ioc和aop功能
    curl命令服务器上执行http请求
    (附源码)springboot人体健康检测微信小程序 毕业设计 012142
    pytorch 卷积操作
    【SpringBoot】微服务中异步调用数据提交数据库的问题
  • 原文地址:https://blog.csdn.net/weixin_56821642/article/details/133441884