当前位置:   article > 正文

软件设计师算法之分治法--快速排序_快速排序(分治法) 分数 10 全屏浏览 切换布局 作者 王东 单位 贵州师范学院 快速

快速排序(分治法) 分数 10 全屏浏览 切换布局 作者 王东 单位 贵州师范学院 快速

                  快速排序也是通过分治法。它的思路是先确定第一个元素的位置,该位置之前的元素全部小于第一个元素,该位置之后的元素全部大于该元素。确定位置后,把数组分为了前后2部分,对这2部分执行递归操作,直达递归到数组为1的大小,即递归到了最底层,即完成了排序过程。

                 比如数组  5, 3,8, 1, 23, 14,首先选取第一个元素为,5,我们现在要确定5的位置。

                 首先,从后面开始和2(待确定位置的元素)比较,14 大于2,往前一个元素为23,仍然大于2,继续往前,直到看到元素1, 1比2小,交换这2个元素,

数组变为: 1 , 3, 8,5, 23, 14

                 接着,我们从前面开始比较, 3比5小,往后为8,8比5大,交换这2个元素,

 数组变为: 1,3,5,8, 23,14 

                交换后,前后的位置已经重叠了。那么5的位置也确定了。可以看出,5的位置前面的元素都小于5,5后面的元素全部都大于5。对5前后的2部分执行递归操作,即可完成整个排序过程。

                代码如下:

  1. void QuickSort(int data[],int dataLen)
  2. {
  3. QuickSortHelp(data,0,dataLen-1);
  4. }
  5. void Exchange(int dataSrc[],int index1,int index2)
  6. {
  7. int v = dataSrc[index1];
  8. dataSrc[index1] = dataSrc[index2];
  9. dataSrc[index2] = v;
  10. }
  11. void static QuickSortHelp(int dataSrc[],int start,int end)
  12. {
  13. if(start<end)
  14. {
  15. int s = start;
  16. int e = end;
  17. int val = dataSrc[s];//待确定位置的元素,这里选择首个元素
  18. int valPos = s;
  19. while(s<e)
  20. {
  21. //先从最后面开始往前面扫描数组,一一和val比较
  22. while(s<e)
  23. {
  24. if(val<=dataSrc[e])
  25. {
  26. e--;
  27. }
  28. else
  29. {
  30. //待确定位置的元素比后面的大,交换
  31. Exchange(dataSrc,valPos,e);
  32. valPos = e;
  33. break;
  34. }
  35. }
  36. //再从前面开始往后面扫描数组,一一和val比较
  37. while(s<e)
  38. {
  39. if(val>=dataSrc[s])
  40. {
  41. s++;
  42. }
  43. else
  44. {
  45. //待确定位置的元素比前面的小,交换
  46. Exchange(dataSrc,valPos,s);
  47. valPos = s;
  48. break;
  49. }
  50. }
  51. }
  52. //待确定位置的val已经确定为valPos,valPos把数组分为了2半
  53. //对前后2半执行递归操作,直到划分的数组大小为1,那么都有序,排序递归也就递归到最底层了
  54. QuickSortHelp(dataSrc,start,valPos-1);
  55. QuickSortHelp(dataSrc,valPos+1,end);
  56. }
  57. }

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

闽ICP备14008679号