• 排序算法问题


    给你一个整数数组 nums,请你将该数组升序排列

    示例 1:

    输入:nums = [5,2,3,1]
    输出:[1,2,3,5]

    示例 2:

    输入:nums = [5,1,1,2,0,0]
    输出:[0,0,1,1,2,5]

    代码如下:

    1.插入排序(简单插入排序、直接插入排序)

    1. //算法思想;从当前位置开始,从后往前找比数字小的,找到后插入到这个小的数字后面
    2. //再找的过程中,如果发现一个比当前数字大,同时将这个数字往后移动
    3. //时间复杂度:O(n^2) 空间复杂度O(1) 稳定性:稳定,没有跳跃式的交换数据
    4. //直接插入排序的特点:越有序越快;完全有序能达到O(n);
    5. class Solution {
    6. public:
    7. void InsertSort(vector<int>& nums,int n)
    8. {
    9. for(int i=0;i
    10. {
    11. int temp = nums[i];//记录未排序数组的下标
    12. int j = i-1;//记录已经排序数组的下标
    13. while(j >= 0 && nums[j] >temp)
    14. {
    15. nums[j+1] = nums[j];//当已经排序好的数组数字大于未排序的数组数字,将已经排序好的数字向后移一个
    16. j--;
    17. }
    18. nums[j+1] = temp;//如果未排序的数组数字大于已经排序好的数字,直接插入到排序好的数字后面
    19. }
    20. }
    21. vector<int> sortArray(vector<int>& nums) {
    22. int n=nums.size();
    23. InsertSort(nums,n);
    24. return nums;
    25. }
    26. };

    2.希尔排序

    1. //直接插入排序越有序越快是希尔排序的一个理论基础
    2. //算法描述:1.间隔式的分组 2.利用直接插入排序让组内有序 3.缩小分组再次排序 4.再次调用直接插入排序 ...直到缩为一组完全有序
    3. //时间复杂度:O(n^1.3-n^1.5) 空间复杂度:O(1) 稳定性:不稳定
    4. class Solution {
    5. public:
    6. void ShellSort(vector<int>& nums,int n)
    7. {
    8. int gap=n;
    9. while(gap>1)//间隔式分组,每一组利用直接插入排序,让组内有序
    10. {
    11. gap/=2;//每次分组都在上一组的基础上折半
    12. for(int i=gap;i
    13. {
    14. int temp = nums[i];
    15. int j = i-gap;
    16. while(j >= 0 && nums[j] >temp)
    17. {
    18. nums[j+gap] = nums[j];
    19. j-=gap;
    20. }
    21. nums[j+gap] = temp;
    22. }
    23. }
    24. }
    25. vector<int> sortArray(vector<int>& nums) {
    26. int n=nums.size();
    27. ShellSort(nums,n);
    28. return nums;
    29. }
    30. };

    3.冒泡排序

    代码如下:

    1. //两两比较,大的往后走
    2. //时间复杂度:O(n^2) 空间复杂度:O(1) 稳定性:稳定
    3. class Solution {
    4. public:
    5. void BubbleSort(vector<int>& nums,int n)
    6. {
    7. for(int i=0;i-1;i++)//走的趟数
    8. {
    9. for(int j=0;j-1;j++)//每走一遍,最大的数字在最后面,走的次数越多,越往后面的数字排序越正确
    10. {
    11. if(nums[j]>nums[j+1])//两两交换,较大的数字在后面
    12. {
    13. int temp=nums[j];
    14. nums[j]=nums[j+1];
    15. nums[j+1]=temp;
    16. }
    17. }
    18. }
    19. }
    20. vector<int> sortArray(vector<int>& nums) {
    21. int n=nums.size();
    22. BubbleSort(nums,n);
    23. return nums;
    24. }
    25. };

    4.快速排序

    代码如下:

    1. //算法描述:先在数据中找到一个基准,从后往前找比基准小的数字,找到后往前挪动
    2. //从前往后找比基准大的数字,找到往后挪动 重复之前的动作
    3. //一次划分的时间复杂度:O(n) 划分logn次
    4. //时间复杂度:O(nlogn) 空间复杂度:O(logn)(递归的次数)
    5. //快排的缺点:空间复杂度大,不稳定
    6. //快排最大缺点:越有序越慢,完全有序,为O(n^2)退化为选择排序
    7. class Solution {
    8. public:
    9. void QuickSort(vector<int>& nums,int left,int right)
    10. {
    11. if(left>=right)//只有一个数或区间不存在
    12. {
    13. return;
    14. }
    15. int i=left,j=right;//i在最左边,j在最右边
    16. int base=nums[left];//定义最左边的数字为基准
    17. while(i
    18. {
    19. while(nums[j]>=base&&i//从后往前找比这个比准数字小的
    20. {
    21. j--;
    22. }
    23. while(nums[i]<=base&&i//从前往后找比这个基准数字大的
    24. {
    25. i++;
    26. }
    27. swap(nums[i],nums[j]);//找到之后交换两个数字
    28. }
    29. nums[left]=nums[i];//当i=j时,将基准数字与nums[i]交换
    30. nums[i]=base;
    31. //在一次完成之后,左边的数字都比基准数字小,右边的数字都比基准数字大
    32. QuickSort(nums,left,i-1);//递归左边
    33. QuickSort(nums,i+1,right);//递归右边
    34. }
    35. vector<int> sortArray(vector<int>& nums) {
    36. int n=nums.size();
    37. QuickSort(nums,0,n-1);
    38. return nums;
    39. }
    40. };

    5.选择排序

    代码如下:

    1. //算法描述:每次都从待排序中找到最小值和待排序的第一个交换
    2. //时间复杂度:O(n^2) 空间复杂度:O(1) 稳定性:不稳定
    3. class Solution {
    4. public:
    5. void SelectSort(vector<int>& nums,int n)
    6. {
    7. int minIndex;
    8. for(int i=0;i-1;i++)
    9. {
    10. minIndex=i;
    11. for(int j=i+1;j
    12. {
    13. if(nums[minIndex]>nums[j])
    14. {
    15. minIndex=j;
    16. }
    17. }
    18. swap(nums[i],nums[minIndex]);
    19. }
    20. }
    21. vector<int> sortArray(vector<int>& nums) {
    22. int n=nums.size();
    23. SelectSort(nums,n);
    24. return nums;
    25. }
    26. };

  • 相关阅读:
    [MATLAB学习]:Matlab生成滑动平均滤波算法文件并移植到STM32单片机上运行——基于CubeMX
    matlab 神经网络 ANN 分类
    Docker Buildkit(新增 --mount、--security、--network 等特性)
    C++11 智能指针之weak_ptr
    ESP32 系列之 ESP-IDF 官方构建方案
    Tomcat服务
    Android解决Toast的重复点击问题也可以叫消息队列
    计算机毕业设计(附源码)python助游乐系统
    DE0开发板交通灯十字路口红绿灯VHDL
    FFmpeg 命令:从入门到精通 | ffmpeg 命令视频录制
  • 原文地址:https://blog.csdn.net/m0_62379712/article/details/132646455