当前位置:   article > 正文

【分治算法】用C语言解决快速排序问题_c语言快速排序算法问题有哪些

c语言快速排序算法问题有哪些

一、分治算法要点

1、可分 2、同质 3、有终 4、无关 5、可合

二、分治算法的实现

1、递归 2、非递归

三、快速排序

1、快速排序的思想就是从n个元素中任取一个元素(通常为第1个元素))作为基准,将整个数据序列分为两个子序列,小于基准的元素放在前子序列中,大于基准的序列放在后子序列中,并把基准放在两个子序列中间,后对两个子序列反复执行,直到每个子序列为空或只有一个元素为止。

2、分治策略如下:

1)将原子序列a[s..t]分为a[s,i-1]和a[i+1,t]两个部分,i为基准,将整个问题分解为两个子问题。

2)递归求解子问题直至子序列内的元素为0或者1

3)由于问题在数组a中进行,故不需要合并过程看个图可能更能理解含义^-^

3、代码实现

  1. #include <stdio.h>
  2. void disp(int a[],int n) /*输出数组元素*/
  3. {
  4. int i;
  5. for(i=0;i<n;i++)
  6. printf("%d",a[i]);
  7. printf("\n");
  8. }
  9. int Partition(int a[],int s,int t) /*划分算法*/
  10. {
  11. int i=s;
  12. int j=t;
  13. int tmp=a[s];
  14. while(i!=j)
  15. {
  16. while(i<j&&a[j]>=tmp) /*从右向左扫描,找小于tmp的a[j]*/
  17. j--;
  18. a[i]=a[j]; /*若小于tmp则将a[j]前移至a[i]*/
  19. while(i<j&&a[i]<=tmp) /*从左向右扫描,找大于tmp的a[i]*/
  20. i++;
  21. a[j]=a[i]; /*若大于tmp则将a[i]后移至a[j]*/
  22. }
  23. a[i]=tmp;
  24. return i;
  25. }
  26. void QuickSort(int a[],int s,int t) /*对a[s..t]中的序列进行排序*/
  27. {
  28. if(s<t)
  29. {
  30. int i=Partition(a,s,t);
  31. QuickSort(a,s,i-1); /*对左序列进行递归排序*/
  32. QuickSort(a,i+1,t); /*对右序列进行递归排序*/
  33. }
  34. }
  35. void main()
  36. {
  37. int n=10;
  38. int a[]={2,5,1,7,10,6,9,4,3,8};
  39. printf("排序前:");
  40. disp(a,n);
  41. QuickSort(a,0,n-1);
  42. printf("排序后:");
  43. disp(a,n);
  44. }

4、运行结果

 

 

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

闽ICP备14008679号