• 面试基础题【1】--排序算法


    今天跟老师交流了一下,注重数据结构以及一些基础算法的学习,面试不会太难,但很重视基础。

    恍然间吓出一身冷汗!树、各种链表、各种排序等等我都不是很熟!┭┮﹏┭┮

    今儿就来个排序算法吧!!!

    Part.1——十大排序算法

    个人记忆口诀:冒泡选择插,希尔归并快,堆、桶、计数、基

    1.1----bubbleSort

    排序算法        平均时间复杂度        最好情况        最坏情况        空间复杂度        稳定性

    冒泡排序        O(n^2)                        O(n)                O(n^2)                O(1)                稳定

    排序思想:检查序列中的相邻元素,如果逆序交换,进行 n-1次循环检查。

    例子:-3  5  1 -2  8  7  冒泡排序

    1. void bubbleSort(vector<int>& v)
    2. {
    3. for (int i = 0; i < v.size()-1; i++){
    4. for (int j = 0; j < v.size()-1; j++){
    5. int tmp = 0;
    6. if (v[j] > v[j+1]) {
    7. tmp = v[j];
    8. v[j] = v[j+1];
    9. v[j+1] = tmp;
    10. }
    11. }
    12. }
    13. return v;
    14. }

    第一层循环:遍历次数;第二层循环:两两交换相邻元素,如果不满足从小到大/从大到小排序条件的话。

    稳定:如果序列存在前后元素相等,排序后,该前后顺序不变

    优化:某次循环中,没有发生交换,就直接跳出

    1.2----selectionSort

    排序算法        平均时间复杂度        最好情况        最坏情况        空间复杂度        稳定性

    选择排序        O(n^2)                        O(n^2)                O(n^2)           O(1)            不稳定

    排序思想:

    第一次检查,将0----n区间的最小值与v[0]进行交换;

    第二次检查,将1----n-1区间的最小值与v[1]进行交换...以此类推 

    例子:-3  5  1 -2  8  7   选择排序

    1. void selectionSort(vector<int>& v) {
    2. for (int i = 0; i < v.size() - 1;i++)
    3. {
    4. int minnum = INT_MAX;
    5. int index;
    6. for (int j = i; j < v.size() - 1; j++) {
    7. if (minnum > v[j]) {
    8. minnum = v[j]; index = j;
    9. }
    10. }
    11. int tmp;
    12. tmp = v[i];
    13. v[i] = v[index];
    14. v[index] = tmp;
    15. }
    16. return v;
    17. }

    第一层循环:循环次数以及交换数值

    第二层循环:用来找到区间内最小值,并记住最小值的下标

    不稳定:前后相等的元素经过选择排序,相对位置可能会发生改变。

    1.3----insertSort

    排序算法        平均时间复杂度        最好情况        最坏情况        空间复杂度        稳定性

    插入排序        O(n^2)                        O(n)                O(n^2)           O(1)                 稳定

    排序思想:

    将 n 个序列分成两组,一个为有序表,另一个无序表。开始时,有序表只有一个元素,通过不断选择无序表中的第一个元素加入到有序表中,插入至有序表中的适当位置,使之成为新的有序表。 

    1. void insertSort(vector<int>& v)
    2. {
    3. for (int i = 1; i < v.size(); i++) {
    4. int insertVal = v[i];//准备插入左索引表的数
    5. int leftindex = i - 1;//左索引表的最后一个数的下标
    6. while (leftindex >= 0 && insertVal < v[leftindex])
    7. //如果左索引表还有数可以比较 且 右索引表中准备插入的值小于当前左索引表的值,此时需要进行替换
    8. {
    9. v[leftindex + 1] = v[leftindex];//要比较的数与比较的数始终相邻
    10. leftindex--;
    11. }
    12. if (leftindex + 1 != i)v[leftindex + 1] = insertVal;//当前的 v[i]已经变了,不能用v[i]了
    13. }
    14. return v;
    15. }

    第一层循环:遍历右无序表的数;第二层循环:当前右索引表的数每一个左索引表的数作比较。

    稳定:不会改变相同的两个相邻元素的相对顺序。

  • 相关阅读:
    软件设计模式白话文系列(六)代理模式
    java中零拷贝和深拷贝的原理以及实现探究
    Android描边外框stroke边线、rotate旋转、circle圆形图的简洁通用方案,基于Glide与ShapeableImageView,Kotlin
    html2canvas+jsPDF实现前端导出pdf
    vulnhub靶机Funbox11
    Kafka入门
    iframe安全问题
    01Linux基础
    独立机器连接cdh的spark集群,远程提交任务(绝对可以成功,亲测了n遍)
    408计算机组成原理需要背的部分
  • 原文地址:https://blog.csdn.net/qq_57328462/article/details/125487830