zoukankan      html  css  js  c++  java
  • C++实现集中常见的排序算法

    为什么需要复习排序算法,因为面对许多数据处理的时候,我们需要有限考虑时间复杂度,基本排序算法能够给我们很多灵感!

    数据结构 不定
    最差时间复杂度 O(n^2)
    最优时间复杂度 O (n*log n)
    平均时间复杂度 O (n*log n)
    最差空间复杂度 根据实现的方式不同而不同

      

              

    快速排序法:

     1 #include<iostream>
     2 #include<vector>
     3 #include<ctime>
     4 using namespace std;
     5 
     6 #include<boost/timer.hpp>
     7 
     8 
     9 void print(const vector<int>& vec)
    10 {
    11     for (auto ele : vec)
    12     {
    13         cout << ele << " ";
    14     }
    15     cout << endl;
    16 }
    17 //产生随机数组
    18 void makeRandVec(vector<int>&vec, int num)
    19 {
    20     srand((unsigned int)time(nullptr));
    21     for (int i = 0; i < num; i++)
    22     {
    23         vec.push_back(rand() % 101);// 0~100
    24     }
    25 }
    26 
    27 //<5>快速排序 左边挖坑 - 从右边找人填坑 - 右边挖坑 - 从左边找人填坑
    28 void quickSort(vector<int>& vec, int start, int end)
    29 {
    30     // vec 原始: 4 2 8 0 5 7 1 3 9
    31     int i = start;
    32     int j = end;
    33     //基准数
    34     int temp = vec[start]; // temp = 4 // [] 2 8 0 5 7 1 3 9
    35     if (i < j)
    36     {
    37         while (i < j)//循环退出的时候 i = j
    38         {
    39             //从右向左找到比i指向元素小的元素来填上面的[]
    40             while (i < j && vec[j] >= temp)
    41             {
    42                 j--;
    43             }//这里找到了3,下面准备入坑(上面的[] )
    44             if (i < j)
    45             {
    46                 vec[i] = vec[j];//  3 2 8 0 5 7 1 [] 9
    47                 i++;//准备从左向右找一个比基准数大的数
    48             }
    49             //从左向右找到比i指向元素大的元素来填上面的[]
    50             while (i < j && vec[i] < temp)
    51             {
    52                 i++;
    53             }//这里找到了8,下面准备入坑
    54             if (i < j)
    55             {
    56                 vec[j] = vec[i];// 3 2 [] 0 5 7 1 8 9
    57                 j--;
    58             }
    59         }
    60         //此时将基准数放到 i的 位置(此时 i = j; 且左边都比vec[i]小,右边都比vec[i]大)
    61         vec[i] = temp; //3 2 1 0 4 5 8 9
    62         quickSort(vec, start, i - 1);    //递归,对左边
    63         quickSort(vec, i + 1, end);        //递归,对右边
    64     }
    65 }
    66 #define MAX 20
    67 
    68 int main()
    69 {
    70     //准备随机数组
    71     vector<int> rvec;
    72     makeRandVec(rvec, MAX);
    73     //<5>快速排序
    74     vector<int> vec5(rvec);
    75     print(vec5);
    76     int start = 0; int end = vec5.size() - 1;
    77     boost::timer timer5;      quickSort(vec5, start, end);
    78     cout << "the cost time of quickSort = " << 1000 * timer5.elapsed() << "ms" << endl;
    79     print(vec5);
    80 
    81 
    82     return 1;
    83 }

    思考:例如对于 数组 A = 4 2 8 0 5 7 1 3 9 进行排序;

    1、取temp = 4;此时 A = [] 2 8 0 5 7 1 3 9;

    2、从右向左遍历,找一个比temp小的数,也即3,填坑得 A = 3 2 8 0 5 7 1 [] 9;

    3、从左向右遍历,找一个比temp大的数,也即8,填坑得 A = 3 2 [] 0 5 7 1 8 9;

  • 相关阅读:
    web总结
    工作总结
    python积累
    学习地图
    position:absolute绝对定位解读
    利用C++ RAII技术自动回收堆内存
    C++封装常用对象和对头文件探索
    String.split()方法你可能不知道的一面
    动态内存分配(new)和释放(delete)
    C#实现的异步Socket服务器
  • 原文地址:https://www.cnblogs.com/winslam/p/10124590.html
Copyright © 2011-2022 走看看