quick_sort

Dear 丶 2024-04-18 22:50 158阅读 0赞

由于冒泡排序是以相邻元素来比较和交换的,因此,若一个元素离其最终位置较远,则需要进行多次的比较和移动操作。而快速排序则很好的解决了上述问题。

所以,可以说快排是冒泡排序的改进版本。

基本思想:首先选定一个元素作为中间元素,然后将表中所有元素和该元素相比较,将表中比中间元素小的元素调到表的前面,比中间元素大的元素调到表的后

面,再将中间元素放到这两部分之间作为分界点,由此而得到一个划分。然后再对左右两部分分别进行快速排序(即对所得到的两个子表再采用相同的方式来划分和

排序,直到每个子表仅有一个元素或为空表为止,此时便得到一个有序表)。

代码一:

基本思想:p、r分别是待排数组的上下界。首先,用tem存下数组下界元素,腾出空间,待用。i指示的上界的前一个元素空间。如果tem小于a[j],则不作任何操作。

所以,在tem<=a[j]出现之前,a[j]之前的数组元素中已有若干个大于tem的元素了。当第一次出现tem<=a[j]时,将i递增,此时a[i]中的元素是大于tem的,而此时a[j]是不

大于tem的。对调a[i]、a[j],就是将小于tem的元素调到数组前面,大于tem的元素调到数组后面。依此往复。遍历到数组最后时,将tem调到i+1的位置即可。(tem就是

所谓的中间元素了)

[cpp] view plain copy print ?

  1. #include
  2. using namespace std;
  3. int partition(int a[],int p,int r)
  4. {
  5. int i,j,tem,temp;
  6. tem=a[r];
  7. i=p-1;
  8. for(j=p;j<=r-1;j++)
  9. {
  10. if(a[j]<=tem)
  11. {
  12. i++;
  13. temp=a[i];
  14. a[i]=a[j];
  15. a[j]=temp;
  16. }
  17. }
  18. temp=a[i+1];
  19. a[i+1]=a[r];
  20. a[r]=temp;
  21. return i+1;
  22. }
  23. void quick_sort(int a[],int p,int r)
  24. {
  25. int q;
  26. if(p<r)
  27. {
  28. q=partition(a,p,r);
  29. quick_sort(a,p,q-1);
  30. quick_sort(a,q+1,r);
  31. }
  32. }
  33. int main()
  34. {
  35. int a[100];
  36. int i,n;
  37. while(cin>>n,n)
  38. {
  39. for(i=0;i<n;i++)
  40. cin>>a[i];
  41. int p=0;
  42. int r=n-1;
  43. quick_sort(a,p,r);
  44. for(i=0;i<n;i++)
  45. cout<<a[i]<<” “;
  46. cout<<endl<<endl;
  47. }
  48. return 0;
  49. }

    include

    using namespace std;

    int partition(int a[],int p,int r)
    {

    1. int i,j,tem,temp;
    2. tem=a[r];
    3. i=p-1;
    4. for(j=p;j<=r-1;j++)
    5. {
    6. if(a[j]<=tem)
    7. {
    8. i++;
    9. temp=a[i];
    10. a[i]=a[j];
    11. a[j]=temp;
    12. }
    13. }
    14. temp=a[i+1];
    15. a[i+1]=a[r];
    16. a[r]=temp;
    17. return i+1;

    }

  1. void quick_sort(int a[],int p,int r)
  2. {
  3. int q;
  4. if(p<r)
  5. {
  6. q=partition(a,p,r);
  7. quick_sort(a,p,q-1);
  8. quick_sort(a,q+1,r);
  9. }
  10. }
  11. int main()
  12. {
  13. int a[100];
  14. int i,n;
  15. while(cin>>n,n)
  16. {
  17. for(i=0;i<n;i++)
  18. cin>>a[i];
  19. int p=0;
  20. int r=n-1;
  21. quick_sort(a,p,r);
  22. for(i=0;i<n;i++)
  23. cout<<a[i]<<" ";
  24. cout<<endl<<endl;
  25. }
  26. return 0;
  27. }

代码二:

基本思想:把数组最前面的数指定为中间元素,即tem。然后从数组最后开始查找一数小于tem,赋到tem的位置。那么,数组后就空出一位置,此时再从数组

前依次查找一元素大于tem,放到空位置。则数组前又空出一位置。重复上述过程,直到条件不满足。

[cpp] view plain copy print ?

  1. int partition(int a[],int p,int r)
  2. {
  3. int i,j,tem;
  4. tem=a[p];
  5. i=p;
  6. j=r;
  7. while(i!=j)
  8. {
  9. while(item)
  10. j—;
  11. if(i<j)
  12. {
  13. a[i]=a[j];
  14. i++;
  15. }
  16. while(i<j && a[i]<tem)
  17. i++;
  18. if(i<j)
  19. {
  20. a[j]=a[i];
  21. j—;
  22. }
  23. }
  24. a[i]=tem;
  25. return i;
  26. }
  27. void quick_sort(int a[],int p,int r)
  28. {
  29. int q;
  30. if(p<r)
  31. {
  32. q=partition(a,p,r);
  33. quick_sort(a,p,q-1);
  34. quick_sort(a,q+1,r);
  35. }
  36. }

    int partition(int a[],int p,int r)
    {

    1. int i,j,tem;
    2. tem=a[p];
    3. i=p;
    4. j=r;
    5. while(i!=j)
    6. {
    7. while(i<j && a[j]>tem)
    8. j--;
    9. if(i<j)
    10. {
    11. a[i]=a[j];
    12. i++;
    13. }
    14. while(i<j && a[i]<tem)
    15. i++;
    16. if(i<j)
    17. {
    18. a[j]=a[i];
    19. j--;
    20. }
    21. }
    22. a[i]=tem;
    23. return i;

    }

    void quick_sort(int a[],int p,int r)
    {

    1. int q;
    2. if(p<r)
    3. {
    4. q=partition(a,p,r);
    5. quick_sort(a,p,q-1);
    6. quick_sort(a,q+1,r);
    7. }

    }

Attention:

①快排是就地排序,直接在原数组上操作,只需少量的辅助空间。

②平均耗时为O(nlog2n),并且隐含的常数因子很小,是一般的最佳实用选择。

③每次partition()的过程都可以确定一个数的最终位置。每次partition()中指定的中间元素(tem),理论上是任意的(代码一指定数组最后的元素,代码二中

指定数组最前面的元素为tem)。

④快速排序是不稳定的。

发表评论

表情:
评论列表 (有 0 条评论,158人围观)

还没有评论,来说两句吧...

相关阅读

    相关 快速排序(Quicksort)算法

    基本思想 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以

    相关 QuickSort

    快速排序:基于分治的思想,是冒泡排序的改进型。首先在数组中选择一个基准点(该基准点的选取可能影响快速排序的效率,后面讲解选取的方法),然后分别从数组的两端扫描数组,设两