当前位置:   article > 正文

数据结构-练习 13 快排

数据结构-练习 13 快排

快速排序的思想是平常最常用的排序算法之一,因其平均复杂度为NlgN而著称,并且可以不借助其他空间。下面我们就来学习一下快排。

        看看原理吧。

        快速的排序采用了分而治之的思想。选取一个基元,分别与之比较,进行一次partition,再循环进行。

       原理图解如下:假设以6为基元,

                                  i,j俩个相当于指针,分别指示小于基元和大于基元的数。

      第一步:i指向3的前一个位置,j指向3,观察j指向的数与基元6的大小,小于则i++,然后i,j指向的数互换,j再++;相反,大于6,则i不变,j++。此处,i,j都指向3,互换      不变;

      第二步:如第2行,j指向的数是4,小于6,按上面的规则,此时,i++, i,j指向4,互换仍然不变,j++;

     第三步:如第三行,j指向的是9,大于6,j++;

     第四步:如第四行,j指向的是1,此时i指向4,i先++,i指向9,1和9互换,j++,如第6行;

     第五步:第六行,第七行,j指向的数均大于6,i不变,直至,基元的前一个位置。

     最后一步:i++,i指向的数和基元互换。如第九行。进行这一步的原因是:经过这五部的调整,基元调整到中间就可以把大于基元和小于基元的数分开。

    上面整个过程完成了一次PARTITION。

     然后再类似地对分组后的元素进行PARTITION。从而完成整个快速排序的过程。余下部分的排序过程如图所示,最后我们得到了从小到大的排序结果。

                   

 

 

 

 

   

                                            


 

 整个过程采用了:分治法,递归的思想。目前采用到分治和递归思想的排序有:归并,八皇后,树的遍历,图的遍历。

  接下来自然是 上代码了:

   //n是新的分组的大小,startLoc是新分组的起始位置。

  1. void fastSort(int * inputData,int n,int startLoc)
  2. {
  3. if(n<2) return ;//递归停止的条件
  4. int i=startLoc-1;//指向最后一个小于基元的数据
  5. int j=startLoc;//移动j,挨个遍历元素
  6. int baseDa=inputData[startLoc+n-1];//获取基元
  7. int tmp;
  8. int k=0;
  9. while(j<=startLoc+n-1)
  10. {
  11. if(inputData[j]<inputData[startLoc+n-1]||j==startLoc+n-1)
  12. {
  13. i++;
  14. k++;
  15. //交换
  16. tmp=inputData[j];
  17. inputData[j]=inputData[i];
  18. inputData[i]=tmp;
  19. }
  20. j++;
  21. }
  22. startLoc=i-k+1;//左边分组的位置,右边分组的位置为:i+1
  23. fastSort(inputData,i-startLoc,startLoc);
  24. fastSort(inputData,n-(i-startLoc)-1,i+1);
  25. }

 测试:

  1. int main()
  2. {
  3. //递归调用
  4. int a[11]={3,4,9,1,8,7,6,2,5,1,3};
  5. fastSort( a,11,0);
  6. for(int i=0;i<11;i++)
  7. std::cout<<a[i]<<",";
  8. return 0;
  9. }



结论:采用递归的思想,很容易混淆。注意三点:

1 ,递归的思想,一定是函数包含函数本身;

2,在函数里一定有其他代码,其作用当然是实现功能;

3,特别注意参数的调整,即下次传入递归函数的参数。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/592751
推荐阅读
相关标签
  

闽ICP备14008679号