V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
thinkIn
V2EX  ›  C

关于 C 快排的问题,总有问题,求教

  •  
  •   thinkIn · 2015-06-18 16:30:23 +08:00 · 1288 次点击
    这是一个创建于 3447 天前的主题,其中的信息可能已经有所发展或是发生改变。

    void iswap(int *v,int *t)
    {
    *v=*v^*t;
    *t=*v^*t;
    *v=*v^*t;
    }

    void iqsort(int *v,int begin,int end)
    {
    int left=begin;
    int right=end;
    int flag=v[(begin+end)/2];

    if(begin>=end)
        return;
    
    iswap(&v[left],&v[(begin+end)/2]);
    
    while(left<right){
        while(left<right&&v[right]>flag)
            right--;
        v[left++]=v[right];
        while(left<right&&v[left]<=flag)
            left++;
        v[right--]=v[left];
    }
    v[left]=flag;
    
    iqsort(v,begin,left-1);
    iqsort(v,left+1,end);
    

    }

    当对{2,5,4,9,8,4,65}排序时,会有问题。什么原因呢?

    10 条回复    2015-06-22 14:06:18 +08:00
    theFool
        1
    theFool  
       2015-06-18 16:45:23 +08:00   ❤️ 1
    void iswap(int *v,int *t) {
    int temp = *v;
    *v = *t;
    *t = temp;
    }

    void iqsort(int *v,int begin,int end) {
    int left=begin;
    int right=end;
    int flag=v[(begin+end)/2];

    if(begin>=end)
    return;

    iswap(&v[left],&v[(begin+end)/2]);

    while(left<right) {
    while(left<right&&v[right]>flag)
    right--;
    v[left]=v[right];
    while(left<right&&v[left]<=flag)
    left++;
    v[right]=v[left];
    }
    v[left]=flag;

    iqsort(v,begin,left-1);
    iqsort(v,left+1,end);
    }
    thinkIn
        2
    thinkIn  
    OP
       2015-06-18 16:46:38 +08:00
    原因找到了,v[left++]=v[right]-->v[left]=v[right]; v[right--]=v[left]--> v[right]=v[left];
    zonghua
        3
    zonghua  
       2015-06-18 17:08:13 +08:00 via iPhone
    为什么要用指针
    czheo
        4
    czheo  
       2015-06-19 07:58:16 +08:00
    可以吐槽代码风格么
    wdlth
        5
    wdlth  
       2015-06-19 09:38:07 +08:00
    用亦或,想法不错。
    foreverhy
        6
    foreverhy  
       2015-06-19 09:45:38 +08:00
    xor交换变量比普通方法要慢啊。
    thinkIn
        7
    thinkIn  
    OP
       2015-06-19 11:15:25 +08:00
    异或的方法并不会有性能上的优势,主要是懒的再定义一个变量。
    617019296
        8
    617019296  
       2015-06-19 13:14:30 +08:00 via Android
    关键根本没必要交换,,直接取出第一个即可。。。
    thinkIn
        9
    thinkIn  
    OP
       2015-06-19 13:23:24 +08:00
    @617019296
    好的快排算法,并不是单取某一特定值做flag,一般会随机取的
    617019296
        10
    617019296  
       2015-06-22 14:06:18 +08:00 via Android
    @thinkIn 那就随机去咯,,也不用交换啊,,感觉这步很蛋疼。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5635 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 46ms · UTC 07:13 · PVG 15:13 · LAX 23:13 · JFK 02:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.