• 排序算法-快速排序法(QuickSort)


     排序算法-快速排序法(QuickSort)

    1、说明

    快速排序法是由C.A.R.Hoare提出来的。快速排序法又称分割交换排序法,是目前公认的最佳排序法,也是使用分而治之(Divide and Conquer)的方式,会先在数据中找到一个虚拟的中间值,并按此中间值将所有打算排序的数据分为两部分。其中小于中间值的数据放在左边,而大于中间值的数据放在右边,再以同样的方式分别处理左右两边的数据,直到排序完为止。操作与分割步骤如下:

    假设有n项记录R_{1},R_{2},R_{3},...,R_{n},其键值为K_{1},K_{2},K_{3},...,K_{n}

    1. 先假设K的值为第一个键值。
    2. 从左向右找出键值K_{i},使得K_{i}> K
    3. 从左向右找出键值K_{j},使得K_{j}< K
    4. 如果i< j,那么K_{i}K_{j}互换,并回到步骤2。
    5. 如果i\geqslant j,那么将KK_{j}互相,并以j为基准点分割成左、右两部分,然后针对左、右两边执行步骤1~5,直到左边键值等于右边键值为止。

    2、算法分析

    1. 在最好情况和平均情况下,时间复杂度为O(nlog_{2^{}}n)。在最坏情况下就是每次挑中的中间值不是最大就是最小的,其时间复杂度为O(n^{2})
    2. 快速排序法不是稳定排序法。
    3. 在最坏情况下,空间复杂度为O(n),而在最好情况下,空间复杂度为O(log_{2^{}}n)
    4. 快速排序法是平均运行时间最快的排序法。

    3、C++代码 

    1. #include
    2. using namespace std;
    3. void Print(int tempData[], int tempSize) {
    4. for (int i = 0; i < tempSize; i++) {
    5. cout << tempData[i] << " ";
    6. }
    7. cout << endl;
    8. }
    9. void Quick(int tempData[], int tempLeft, int tempRight) {
    10. int temp;
    11. int leftIndex;
    12. int rightIndex;
    13. int t;
    14. if (tempLeft < tempRight) {
    15. leftIndex = tempLeft + 1;
    16. rightIndex = tempRight;
    17. while (true) {
    18. for (int i = tempLeft + 1; i < tempRight; i++) {
    19. if (tempData[i] >= tempData[tempLeft]) {
    20. leftIndex = i;
    21. break;
    22. }
    23. leftIndex++;
    24. }
    25. for (int j = tempRight; j > tempLeft + 1; j--) {
    26. if (tempData[j] <= tempData[tempLeft]) {
    27. rightIndex = j;
    28. break;
    29. }
    30. rightIndex--;
    31. }
    32. if (leftIndex < rightIndex) {
    33. temp = tempData[leftIndex];
    34. tempData[leftIndex] = tempData[rightIndex];
    35. tempData[rightIndex] = temp;
    36. }
    37. else {
    38. break;
    39. }
    40. }
    41. if (leftIndex >= rightIndex) {
    42. temp = tempData[tempLeft];
    43. tempData[tempLeft] = tempData[rightIndex];
    44. tempData[rightIndex] = temp;
    45. Quick(tempData, tempLeft, rightIndex - 1);
    46. Quick(tempData, rightIndex + 1, tempRight);
    47. }
    48. }
    49. }
    50. int main() {
    51. const int size = 10;
    52. int data[100] = { 32,5,24,55,40,81,17,48,25,71 };
    53. //32 5 24 55 40 81 17 48 25 71
    54. //32 5 24 25 40 81 17 48 55 71
    55. //32 5 24 25 17 81 40 48 55 71
    56. //17 5 24 25 32 81 40 48 55 71
    57. //5 17 24 25 32 81 40 48 55 71
    58. //5 17 25 24 32 81 40 48 55 71
    59. //5 17 25 24 32 71 40 48 55 81
    60. //5 17 25 24 32 55 40 48 71 81
    61. //5 17 25 24 32 48 40 55 71 81
    62. //5 17 25 24 32 40 48 55 71 81
    63. Print(data, size);
    64. Quick(data, 0, size - 1);
    65. Print(data, size);
    66. return 0;
    67. }

    输出结果 

  • 相关阅读:
    ASEMI快恢复二极管SF2006参数,SF2006规格,SF2006封装
    数人云操作系统 2.0 发布
    张驰咨询:家电企业用六西格玛项目减少客户非合理退货案例
    【微信小程序】实现组件间代码共享的behaviors
    国家网络安全周2023时间是什么时候?有什么特点?谁举办的?
    【面试经典150 | 算术平方根】
    【考研数学】概率论与数理统计 —— 第七章 | 参数估计(1,基本概念及点估计法)
    css-渐变色矩形
    商业合作保密协议 (2)
    uniapp地图自定义文字和图标
  • 原文地址:https://blog.csdn.net/qq_40660998/article/details/133782283