user-0 提问: 为什么我的快排速度这么慢。。。。。。。。。。求解释 跪求

回复:
user: user-1
content: 可能是因为待排列的数字有很多重复，造成类似冒泡的算法， 用了>=符号。

user: user-0
content: 引用 4 楼 lm_whales 的回复:[quote=引用 3 楼 guo1105094218 的回复:] 谢谢了哦 但是我拷贝别人的在我电脑上运行超级块 100000输入只要0.34s，，，，，我也在研究 希望大牛解惑下面附别人代码  void swap(int *a,int *b){     int s;     s=*a;     *a=*b;     *b=s; }  int *split (int *head , int *tail) {    int middle = *(head + (tail  -  head) / 2);    while (1)    {        while (*head  <  middle)             head++;        tail--;        while (*tail  >  middle)             tail--;        if (head >= tail)             return head;        swap (head , tail);        head++;    } } //快速排序 , 递归调用 void QuickSort(int * first , int *last)           //这个快排太强悍了 1024000输入 耗时0.43s {      if (last  >  first+1)     {          int *t=split(first, last); //返回中间值所在的位置          //判断前一段和后一段的长度，  为了提高效率长度小的先操作 ，          if (last -t < t - first)          {               QuickSort(t, last);               QuickSort(first , t);          }          else          {               QuickSort(first , t);               QuickSort(t, last);          }     } } 这个就是，标准的三数中值分割，快排算法，  唯一的小改进，就是长度小的先操作，这也能稍微改进效率。 速度当然快了。  如果，能够在数据量小的时候， 用插入排序替换，效率更高。  三数中值分割，一般来说，比随即算法要好；  因为随即数生成算法，代价太高。 理论上，随即算法是最快的。 而且没有最坏的情况发生。  不过，由于随即数生成算法，代价太高； 随即算法只有理论价值，并无实用意义。  三数中值分割，的随即性已经比较好了， 所以已经算是，实际意义上的，快速排序的最快的算法了。 最坏情况几乎不会发生。  据说，用堆排序改进的快速排序 （当递归深度到一定层次，改为堆排序） 可以实现最坏 O(Nlog(N))时间复杂度的快速排序。   [/quote] 嗯嗯  我再去研究研究 谢谢了 自己太菜了

user: user-2
content: 引用 3 楼 guo1105094218 的回复:谢谢了哦 但是我拷贝别人的在我电脑上运行超级块 100000输入只要0.34s，，，，，我也在研究 希望大牛解惑下面附别人代码  void swap(int *a,int *b){     int s;     s=*a;     *a=*b;     *b=s; }  int *split (int *head , int *tail) {    int middle = *(head + (tail  -  head) / 2);    while (1)    {        while (*head  <  middle)             head++;        tail--;        while (*tail  >  middle)             tail--;        if (head >= tail)             return head;        swap (head , tail);        head++;    } } //快速排序 , 递归调用 void QuickSort(int * first , int *last)           //这个快排太强悍了 1024000输入 耗时0.43s {      if (last  >  first+1)     {          int *t=split(first, last); //返回中间值所在的位置          //判断前一段和后一段的长度，  为了提高效率长度小的先操作 ，          if (last -t < t - first)          {               QuickSort(t, last);               QuickSort(first , t);          }          else          {               QuickSort(first , t);               QuickSort(t, last);          }     } } 这个就是，标准的三数中值分割，快排算法，  唯一的小改进，就是长度小的先操作，这也能稍微改进效率。 速度当然快了。  如果，能够在数据量小的时候， 用插入排序替换，效率更高。  三数中值分割，一般来说，比随即算法要好；  因为随即数生成算法，代价太高。 理论上，随即算法是最快的。 而且没有最坏的情况发生。  不过，由于随即数生成算法，代价太高； 随即算法只有理论价值，并无实用意义。  三数中值分割，的随即性已经比较好了， 所以已经算是，实际意义上的，快速排序的最快的算法了。 最坏情况几乎不会发生。  据说，用堆排序改进的快速排序 （当递归深度到一定层次，改为堆排序） 可以实现最坏 O(Nlog(N))时间复杂度的快速排序。

user: user-0
content: 谢谢了哦 但是我拷贝别人的在我电脑上运行超级块 100000输入只要0.34s，，，，，我也在研究 希望大牛解惑下面附别人代码  void swap(int *a,int *b){     int s;     s=*a;     *a=*b;     *b=s; }  int *split (int *head , int *tail) {    int middle = *(head + (tail  -  head) / 2);    while (1)    {        while (*head  <  middle)             head++;        tail--;        while (*tail  >  middle)             tail--;        if (head >= tail)             return head;        swap (head , tail);        head++;    } } //快速排序 , 递归调用 void QuickSort(int * first , int *last)           //这个快排太强悍了 1024000输入 耗时0.43s {      if (last  >  first+1)     {          int *t=split(first, last); //返回中间值所在的位置          //判断前一段和后一段的长度，  为了提高效率长度小的先操作 ，          if (last -t < t - first)          {               QuickSort(t, last);               QuickSort(first , t);          }          else          {               QuickSort(first , t);               QuickSort(t, last);          }     } }

user: user-2
content: head，tail距离比较小的时候 （1~20之间） 使用插入排序就会加快，快排的速度。

user: user-3
content: 正常10w的话1秒绝对够。这代码也没什么明显的问题。上完整代码+cpu配置