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

2015-06-18 16:30:23 +08:00
 thinkIn

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}排序时,会有问题。什么原因呢?

1291 次点击
所在节点    C
10 条回复
theFool
2015-06-18 16:45:23 +08:00
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
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
2015-06-18 17:08:13 +08:00
为什么要用指针
czheo
2015-06-19 07:58:16 +08:00
可以吐槽代码风格么
wdlth
2015-06-19 09:38:07 +08:00
用亦或,想法不错。
foreverhy
2015-06-19 09:45:38 +08:00
xor交换变量比普通方法要慢啊。
thinkIn
2015-06-19 11:15:25 +08:00
异或的方法并不会有性能上的优势,主要是懒的再定义一个变量。
617019296
2015-06-19 13:14:30 +08:00
关键根本没必要交换,,直接取出第一个即可。。。
thinkIn
2015-06-19 13:23:24 +08:00
@617019296
好的快排算法,并不是单取某一特定值做flag,一般会随机取的
617019296
2015-06-22 14:06:18 +08:00
@thinkIn 那就随机去咯,,也不用交换啊,,感觉这步很蛋疼。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/199596

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX