• 排序算法-快速排序法(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. }

    输出结果 

  • 相关阅读:
    GFS分布式存储
    数据结构预算法——刷题记录二
    ELK创建仪表盘
    JQuery笔记
    [干货]LangChain入门-LangChain框架的构成与特点
    通过python 的selenium 操作shadow前端页面实现自动点击上传图片
    Autosar模块介绍:AutosarOS(2)
    python之函数&返回值&传参&Lambda表达式
    Flink 集群部署
    win10 系统安装 doker 入门详细教程
  • 原文地址:https://blog.csdn.net/qq_40660998/article/details/133782283