V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
ChrisLinn
V2EX  ›  问与答

快排这么写有错不

  •  
  •   ChrisLinn · 2018-01-21 23:52:21 +08:00 · 1074 次点击
    这是一个创建于 2280 天前的主题,其中的信息可能已经有所发展或是发生改变。
    int partition(int arr[], int l, int r) {
        int pPos = l, pValue = arr[l];
        for (int i = l+1; i <= r; ++i)
            if (arr[i] <= pValue) std::swap(arr[i], arr[pPos++]);
        return pPos;
    }
    
    void quicksort(int arr[], int l, int r) { 
        if (l < r) {
            int pivot = partition(arr, l, r);
            quicksort(arr, l, pivot-1);
            quicksort(arr, pivot+1, r);
        }
    }
    

    比经典写法少用一个 swap ?

    
    int partition(int arr[], int l, int r) {
        int pPos = l, pValue = arr[r];
        for (int i = l; i < r; ++i)
            if (arr[i] <= pValue) std::swap(arr[i], arr[pPos++]);
        std::swap(arr[pPos], arr[r]);
        return pPos;
    }
    
    void quicksort(int arr[], int l, int r) { 
        if (l < r) {
            int pivot = partition(arr, l, r);
            quicksort(arr, l, pivot-1);
            quicksort(arr, pivot+1, r);
        }
    }
    
    4 条回复    2018-01-24 10:51:42 +08:00
    ConradG
        1
    ConradG  
       2018-01-22 16:56:46 +08:00
    第一个是错的,以 pValue 为界左小右大的性质不能保持。
    ChrisLinn
        2
    ChrisLinn  
    OP
       2018-01-22 22:35:21 +08:00
    @ConradG 可不可以给个 case 谢谢,我设计的几个 case 都正确排序了
    ConradG
        3
    ConradG  
       2018-01-22 23:21:37 +08:00   ❤️ 1
    @ChrisLinn [2,4,1,3]
    ChrisLinn
        4
    ChrisLinn  
    OP
       2018-01-24 10:51:42 +08:00
    @ConradG xiexie~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2759 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 05:41 · PVG 13:41 · LAX 22:41 · JFK 01:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.