user-0 提问: 快速排序怎么会错呢？

回复:
user: user-1
content: 引用 12 楼 cyd54454 的回复:[quote=引用 10 楼 w673339759 的回复:] [quote=引用 5 楼 lovesmiles 的回复:]     if((left<right)&&(data[left] < data[right])) right--;         if((left<right)&&(data[left] > data[right])) left++; 除了return要移到外面之外，你这部份逻辑是什么意思？  快排是要取一个数当key的。你这样首尾比较，首尾都变动，到底是以什么为标准呢？  你没有理解快排的逻辑。 比较过后，交换的是当前比较的一个元素和left的下一个元素或者right的上一个元素，为什么当前比较的值要和上一个或者下一个值进行交换left++/right++[/quote] 因为这样是错的[/quote] 所以我想了半天，没明白他的思路

user: user-2
content: 没看懂你代码的逻辑

user: user-3
content: 楼主prt越界了。

user: user-4
content: 酷

user: user-5
content: 引用 13 楼 u012549504 的回复:[quote=引用 11 楼 cyd54454 的回复:] [quote=引用 8 楼 u012549504 的回复:] void quicksort(int a[],int low,int high){     while(low<high){     int pos = partion(a,low,high);     quicksort(a,low,pos-1);     quicksort(a,pos+1,high);     }      }[/code] 那这一段怎么会错呢？ 你好好看看这段代码，low和high的值会变么...你传进去0,3就一直是0,3啊，死循环有木有- -[/quote]  但是我递归的时候是 low 到 pos-1啊，这不是在变么[/quote] 假设最初： low = 0，high=2，pos = 1 quicksort(a,low,pos-1);//我去递归               low = 0，high=pos-1=0；//调用后，条件不满足，返回了 quicksort(a,pos+1,high);//哈哈，我又去递归               low=pos+1=2，high=2//调用后，条件不满足，返回了 while(low < high),结果low=0，high=2，又循环去了 不知道我有没有说清...

user: user-6
content: 引用 13 楼 u012549504 的回复:[quote=引用 11 楼 cyd54454 的回复:] [quote=引用 8 楼 u012549504 的回复:] void quicksort(int a[],int low,int high){     while(low<high){     int pos = partion(a,low,high);     quicksort(a,low,pos-1);     quicksort(a,pos+1,high);     }      }[/code] 那这一段怎么会错呢？ 你好好看看这段代码，low和high的值会变么...你传进去0,3就一直是0,3啊，死循环有木有- -[/quote]  但是我递归的时候是 low 到 pos-1啊，这不是在变么[/quote] 你使用pos-1，传过去的是pos-1这个值，并不代表pos=pos-1

user: user-7
content: 你根本没有理解值传递的概念。你在递归里怎么改变参数有什么用?退出来后参数还不是原来的值?

user: user-0
content: 引用 11 楼 cyd54454 的回复:[quote=引用 8 楼 u012549504 的回复:] void quicksort(int a[],int low,int high){     while(low<high){     int pos = partion(a,low,high);     quicksort(a,low,pos-1);     quicksort(a,pos+1,high);     }      }[/code] 那这一段怎么会错呢？ 你好好看看这段代码，low和high的值会变么...你传进去0,3就一直是0,3啊，死循环有木有- -[/quote]  但是我递归的时候是 low 到 pos-1啊，这不是在变么

user: user-5
content: 引用 10 楼 w673339759 的回复:[quote=引用 5 楼 lovesmiles 的回复:]     if((left<right)&&(data[left] < data[right])) right--;         if((left<right)&&(data[left] > data[right])) left++; 除了return要移到外面之外，你这部份逻辑是什么意思？  快排是要取一个数当key的。你这样首尾比较，首尾都变动，到底是以什么为标准呢？  你没有理解快排的逻辑。 比较过后，交换的是当前比较的一个元素和left的下一个元素或者right的上一个元素，为什么当前比较的值要和上一个或者下一个值进行交换left++/right++[/quote] 因为这样是错的

user: user-5
content: 引用 8 楼 u012549504 的回复:void quicksort(int a[],int low,int high){     while(low<high){     int pos = partion(a,low,high);     quicksort(a,low,pos-1);     quicksort(a,pos+1,high);     }      }[/code] 那这一段怎么会错呢？ 你好好看看这段代码，low和high的值会变么...你传进去0,3就一直是0,3啊，死循环有木有- -

user: user-1
content: 引用 5 楼 lovesmiles 的回复:    if((left<right)&&(data[left] < data[right])) right--;         if((left<right)&&(data[left] > data[right])) left++; 除了return要移到外面之外，你这部份逻辑是什么意思？  快排是要取一个数当key的。你这样首尾比较，首尾都变动，到底是以什么为标准呢？  你没有理解快排的逻辑。 比较过后，交换的是当前比较的一个元素和left的下一个元素或者right的上一个元素，为什么当前比较的值要和上一个或者下一个值进行交换left++/right++

user: user-8
content: int part(int data[],size_t left,size_t right){ int tmp ;      while(left < right){         if((left<right)&&(data[left] < data[right]))        {right--;       continue;         }         tmp = a[right];         a[left] = a[right];         a[right] = tmp;       }     while(left < right){         if((left<right)&&(data[left] > data[right]))          {          tmp = a[right];         a[left] = a[right];         a[right] = tmp;         left++;        continue;         }          }          return right ;  }    void quick_sort (int data[], size_t left,size_t right) {     while(left < right){         int pos = part(data,left,right);         quick_sort(data,left,pos -1 );         quick_sort(data,pos+1 ,right);     } }       修改了一下。

user: user-0
content: 引用 5 楼 lovesmiles 的回复:    if((left<right)&&(data[left] < data[right])) right--;         if((left<right)&&(data[left] > data[right])) left++; 除了return要移到外面之外，你这部份逻辑是什么意思？  快排是要取一个数当key的。你这样首尾比较，首尾都变动，到底是以什么为标准呢？  你没有理解快排的逻辑。#include<stdio.h> void quicksort(int a[],int low,int high); int partion(int a[],int low,int high); int main(int argc, char const *argv[]) {     int a[4] ={45,23,34,1};     quicksort(a,0,3);     return 0; }  int partion(int a[],int low,int high) {     int privt = a[low];     while(low<high){         while(low<high&&a[high] >= privt){              --high;         }         a[low++] = a[high];         if(low<high&&a[low++] <= privt){             ++low;         }         a[high--] = a[low];     }     a[low] = privt;     return low; }  void quicksort(int a[],int low,int high){     while(low<high){     int pos = partion(a,low,high);     quicksort(a,low,pos-1);     quicksort(a,pos+1,high);     }      }  那这一段怎么会错呢？

user: user-8
content: int part(int data[],size_t left,size_t right){     while(left < right){         if((left<right)&&(data[left] < data[right]))   {right--; continue;  }                   int tmp = a[right];         a[left] = a[right];         a[right] = tmp;       }         return right ;  }    void quick_sort (int data[], size_t left,size_t right) {     while(left < right){         int pos = part(data,left,right);         quick_sort(data,left,pos -1 );         quick_sort(data,pos+1 ,right);     } }       窃以为 当如此。

user: user-5
content: 简单的论证一下，假设初始值：a[] = {1,2,3},data[]也是{1,2,3}.left = 0;right = 2;           if((left<right)&&(data[left] < data[right])) right--;    //left=0 小于 right=2,&& data[0]=1 小于 data[2] = 3,right--之后right = 1         if((left<right)&&(data[left] > data[right])) left++;//不成立         int tmp = a[left];  // tmp = 1          a[left] = a[right];//a[0] = 2         a[right] = tmp;//a[1] = 1   一趟完成之后，a[] = [2,1,3},应该比较明显了，这已经和快速排序不一致了。 贴一段别的  void quicksort(int num[],int low,int high) {     int i,j;     int tmp;      i = low;     j = high;     tmp = num[i];     while(i < j)     {         while(i < j && num[j] > tmp)                 j--;         if(i < j)         {             num[i] = num[j];             i++;         }         while(i < j && num[i] < tmp)                 i++;         if(i < j)         {             num[j] = num[i];             j--;         }     }     num[i] = tmp;     if(low < i)             quicksort(num,low,i-1);     if(i < high)             quicksort(num,i+1,high); }

user: user-7
content: if((left<right)&&(data[left] < data[right])) right--;         if((left<right)&&(data[left] > data[right])) left++; 除了return要移到外面之外，你这部份逻辑是什么意思？  快排是要取一个数当key的。你这样首尾比较，首尾都变动，到底是以什么为标准呢？  你没有理解快排的逻辑。

user: user-9
content: line 19:        int tmp = a[left];

user: user-10
content: 这份代码里有快速排序的参考示例 http://pan.baidu.com/s/17yIcQ

user: user-0
content: 引用 1 楼 zxhuser-10 的回复:return left;放括号外面不对啊

user: user-10
content: return left;放括号外面