• 排序算法


      1 /*
      2  * 排序:冒泡排序
      3  * 平均时间复杂度:O(n*n)
      4  * 最坏时间复杂度:O(n*n)
      5  * 空间复杂度:O(1)
      6  * 稳定性:稳定
      7  * 思路:它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。
      8  *      走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
      9  *      每一次i的循环就是找到最小的那个数
     10  * */
     11 void SortAlgorithm::bubbleSort(vector<int> A) {
     12     int size = A.size();
     13     if (size < 2) {
     14         return;
     15     }
     16     for (int i = 0; i < size - 1; i++) {
     17         for (int j = i + 1; j < size; j++) {
     18             if (A[i] > A[j]) {
     19                 swap(A[i], A[j]);
     20             }
     21         }
     22     }
     23 }
     24 
     25 /*
     26  * 排序:选择排序
     27  * 平均时间复杂度:O(n*n)
     28  * 最坏时间复杂度:O(n*n)
     29  * 空间复杂度:O(1)
     30  * 稳定性:不稳定  由于每次会有交换所以会导致不稳定  eg:4 2 4 1 第一次交换是第一个4和1交换 导致不稳定
     31  * 思路:每一次找到最小的那个数  交换当前没有排序的最前面的位置
     32  * */
     33 void SortAlgorithm::selectionSort(vector<int> A) {
     34     int size = A.size();
     35     if (size < 2) {
     36         return;
     37     }
     38     for (int i = 0; i < size - 1; i++) {
     39         int indexMin = i;
     40         for (int j = i + 1; j < size; j++) {
     41             if (A[j] < A[indexMin]) {
     42                 indexMin = j;
     43             }
     44         }
     45         if (i != indexMin) {
     46             swap(A[indexMin], A[i]);
     47         }
     48     }
     49 }
     50 
     51 /*
     52  * 排序:直接插入排序
     53  * 平均时间复杂度:O(n*n)
     54  * 最坏时间复杂度:O(n*n)
     55  * 空间复杂度:O(1)
     56  * 稳定性:稳定
     57  * 思路: 插入排序就是后面的元素当成新的元素,插入已经排序好的序列里面
     58  * */
     59 void SortAlgorithm::straightInsertionSort(vector<int> A) {
     60     int size = A.size();
     61     if (size < 2) {
     62         return;
     63     }
     64     for (int i = 1; i < size; i++) {
     65         if (A[i - 1] > A[i]) {
     66             int temp = A[i], j;
     67             for (j = i - 1; j >= 0 && A[j] > temp; j--) {
     68                 A[j + 1] = A[j];
     69             }
     70             A[j + 1] = temp;
     71         }
     72     }
     73 }
     74 
     75 /*
     76  * 排序:快速排序
     77  * 平均时间复杂度:O(nlogn)
     78  * 最坏时间复杂度:O(n*n)
     79  * 空间复杂度:0(logn)
     80  * 稳定性:不稳定
     81  * 思路:通过哨兵的操作 把数组分成 左右两个 把数组的左边的第一个数当成基数  然后从右边开始 右边找比基数小的数 左边找比基数大的数
     82  *      在left<right的时候找到了就交换位置 最后交换左右碰面和基数的位置  就保证了基数左面的数一定小于基数  基数右边的数一定大于基数
     83  *      然后递归 基数左边的  基数右边
     84  * */
     85 void SortAlgorithm::quickSort(int a[], int low, int high) {
     86     if (low >= high) {
     87         return;
     88     }
     89     int first = low;
     90     int last = high;
     91     int key = a[first];
     92 
     93     while (first < last) {
     94         while (first < last && a[last] >= key) {
     95             --last;
     96         }
     97         a[first] = a[last];
     98         while (first < last && a[first] <= key) {
     99             ++first;
    100         }
    101         a[last] = a[first];
    102     }
    103     a[first] = key;
    104     quickSort(a, low, first - 1);
    105     quickSort(a, first + 1, high);
    106 }
  • 相关阅读:
    Day12 文件操作
    Day11 集合、集合操作
    Day10 【小程序】商城管理(购物车小程序的增强版)
    Day8 字符串操作
    Day9 字典操作
    文件操作
    【python练习】购物车程序
    2296 寻找道路
    2661 信息传递(tarjan&拓扑)
    【模板】LCA(tarjan)
  • 原文地址:https://www.cnblogs.com/kanekiken/p/8079008.html
Copyright © 2020-2023  润新知