• 数据结构拾遗——排序(时间复杂度O(n^2))


    复习完数据结构后,决定挑选重要的部分总结一下,顺序暂定从后向前

    所以一开始是排序

    不多说直接上代码

    swap.h

    1 #pragma once  //编译一次
    2 #include <vector>  //数据结构决定简单的使用向量
    3 
    4 template <typename T>  //模板编程适用变量更多
    5 void swapLHW(vector<T> &v, int i, int j) {  //单纯的交换向量中的两个元素
    6     T tmp = v[i];
    7     v[i] = v[j];
    8     v[j] = tmp;
    9 }

    c++自带了swap,不过还是定义了一个自己的

    BubbleSort.h

     1 #pragma once
     2 #include <vector>
     3 #include "swap.h"
     4 template <typename T>
     5 void BubbleSort0 (vector<T> &v) {
     6     for (auto i = 0; i < v.size(); i++)
     7         for (auto j = i + 1; j < v.size(); j++)
     8             if (v[i] > v[j])
     9                 swapLHW(v, i, j);
    10 }
    11 
    12 template <typename T>
    13 void BubbleSort1(vector<T> &v) {
    14     for (auto i = 0; i <v.size(); i++)
    15         for (auto j = v.size() - 1; j > i; j--)
    16             if (v[j] < v[j - 1])
    17                 swapLHW(v, j, j - 1);
    18 }
    19 
    20 template <typename T>
    21 void BubbleSort3(vector<T> &v) {
    22     bool flag = true;
    23     for (auto i = 0; i < v.size() && flag; i++)
    24     {
    25         flag = false;
    26         for (auto j = v.size() - 1; j > i; j--) 
    27         {
    28             if (v[j] < v[j - 1]) 
    29             {
    30                 swapLHW(v, j, j - 1);
    31                 flag = true;
    32             }
    33         }
    34     }
    35 }

    0是简易的冒泡,每次只比较固定的v[i]和递增的v[j]

    事实上v[i]如果是最小了,后面的比较久没有意义

    1是普通的冒泡,每次比较v[j-1]和v[j],两个都是递减的

    如果较小的在后面,可以不断上浮

    如果被更小的截止,更小的可以接着上浮

    2只是简单的判断了一下一次循环有没有交换元素

    如果没有,说明已经排序好,跳出循环

    SelectSort.h

     1 #pragma once
     2 #include "swap.h"
     3 #include <vector>
     4 template <typename T>
     5 void SelectSort(vector<T> &v) {
     6     for (auto i = 0; i < v.size(); i++)
     7     {
     8         int pos = i;
     9         for (auto j = i + 1; j < v.size(); j++)
    10         {
    11             if (v[j] < v[pos])
    12             {
    13                 pos = j;
    14             }
    15         }
    16         if (pos != i)
    17         {
    18             swapLHW(v, i, pos);
    19         }
    20     }
    21 }

    选择排序

    简单的想法,每次扫描未排序好的部分

    选择最小的放前面

    StraightInsertSort.h

     1 #pragma once
     2 #include "swap.h"
     3 #include <vector>
     4 using namespace std;
     5 template <class T>
     6 void StraightIS(vector<T> &v) {
     7     T tmp;
     8     for (auto i = 1; i < v.size(); i++)
     9     {
    10         tmp = v[i];
    11         if (v[i] < v[i - 1])
    12         {
    13             int j = i - 1;
    14             for (; j >= 0 && v[j] > tmp; j--)
    15             {
    16                 v[j + 1] = v[j];
    17             }
    18             v[j + 1] = tmp;
    19         }
    20         
    21     }
    22 }

    直接插入排序

    从第二个开始,依次取第二、三……个元素

    插入到前面的位置

    比这个元素大的元素,向后移动一个位置

  • 相关阅读:
    github使用及介绍
    git分支 & git标签
    nginx配置文件参考
    PHP优化
    Nginx优化
    Git安装及基础命令使用
    JavaScript框架设计-node节点
    论文爬取(一)
    JAVA日报
    JAVA日报
  • 原文地址:https://www.cnblogs.com/linhaowei0389/p/6719955.html
Copyright © 2020-2023  润新知