快速排序

在待排序表中任取一个元素pivot作为基准,通过一趟排序将待排序表分为独立的两个部分,左半边小于pivot,右半边大于或者等于pivot,则pivot放在了其最终的位置L(k)上,这个过程称为一趟快速排序。而后分别对两个子表重复上述过程,直到每个部分内只有一个元素或者为空为止,即所有的元素都放在了其最终的位置。

在选择pivot时,一般假设每次总是以当前表中的第一个元素作为枢轴值对表进行划分,则必须将表中比枢轴值大的元素向右移动,比其小的向左移动。

  1. int Partition(ElemType A[], int low, int high)
  2. {
  3. ElemType pivot = A[low];//将当前表中的第一个元素设为枢纽值,对表进行划分
  4. while(low < high)//循环跳出的条件
  5. {
  6. while(low<high && A[high]>=pivot)
  7. --high;
  8. A[low]=A[high];//将比枢纽值小的元素移动到左端
  9. while(low<high && A[low]<=pivot)
  10. ++low
  11. A[high]=A[low];//将比枢纽值大的元素移动到右端
  12. }
  13. A[low]=pivot;//枢纽元素存放到最终的位置
  14. return low;//返回存放枢纽值的最终位置
  15. }
  16. void QuickSort(ElemType A[], int low ,int high)
  17. {
  18. if(low<high)
  19. {
  20. int pivotPos=Partition(A, low, high);
  21. QuickSort(A, low, pivotPos-1);
  22. QuickSort(A, pivotPos+1, high);
  23. }
  24. }
快速排序构成一个递归树,递归深度即为树的高度。当枢纽值每次都将子表等分时,此时递归树的高为log2n(2为底数),当枢纽值,每次都是子表的最大值或者最小值时,此时递归树退化为单链表,树高为n;





posted @ 2015-08-22 15:10  Lucas_1993  阅读(196)  评论(0编辑  收藏  举报