当前位置: 首页 > news >正文

4月5日排序算法总结(1)

冒泡排序

利用每趟都确定出一个最大值或者最小值

如果需要排一个从小到大的数组,那么我们每一趟都要确定一个最大值放在最后,一共有n个数,我们最多需要排列n-1趟就可以了,我们可以改进自己的代码,利用一个flag标记,最初flag为0,当需要发生交换的时候,flag修改成1,。

冒泡的时间复杂度最优的时候为O(n),最差的时候为O(n^2).

稳定性:稳定

接下来我们写一下代码

void bubblesort(int*nums,int n){for(int i=1;i<=n-1;i++){int flag=0;for(int j=0;j<=n-1-i;j++){if(nums[j]>nums[j+1]){swap(&nums[j],&nums[j+1]);flag=1;}}if(flag==0){return ;}}
}

排序算法都不需要返回值的。

选择排序

根据排序的名字我们就可以了解到这个排序和选择有关,当然我们需要选择一个最大的或者最小的与待排序数组最后一个发生交换。

每次都要查找最后出待排序数组最大的一个元素,我们采用遍历的形式,最好用index标记最大值的数组下标。

void seletsort(int*nums,int n){for(int i=1;i<=n-1;i++){int maxindex=0;for(int j=1;j<n-i;j++){if(nums[maxindex]<nums[j]){maxindex=j;}}if(maxindex!=n-i){swap(&nums[maxindex],&nums[n-i]);}}
}

时间复杂度O(n^2),在性能上优于冒泡,稳定性:不稳定;

因为当几个相同的元素,在筛选的时候会优先选择前边的先排列,会造成元素之间位置交换,所以选择排序在稳定性上并不稳定。

插入排序

将数组分为有序区和无序区,在未排序的时候数组有序区元素个数为1个,nums[0],遍历无序区,

将无序区第一个元素与有序区的元素依次比较,如果无序区元素大于有序区元素,那么不用发生位置变化,如果小于有序区元素,有序区元素就要依次向后移动一位。

代码如下

void insertsort(int*nums,int n){for(int i=1;i<=n-1;i++){int j=i-1;int temp=nums[i];for(;j>=0;j--){if(nums[j]>temp){nums[j+1]=nums[j];}else{break;}}nums[j+1]=temp;}
}

时间复杂度:当最好的情况数组本身就是有序的,O(n),

                      最糟糕的情况O(n^2);

                      直接插入排序比冒泡选择的性能好一些。

稳定性分析:稳定的

计数排序(桶排序)

望文生义,桶排序就像一个大桶一样把数据都存储进去,我们把数组比喻成了桶,遍历一遍我们的待排序数组,把数组中成功出现的元素,记录在新数组中

这个新数组我们需要利用calloc申请空间,因为calloc申请的数组默认初始化为0,最后记得要释放内存。

一个数可能在待排序数组中出现好多次我们需要解决好这个问题不能遗漏元素。

桶排序不是元素比较而是利用下标来确定元素的正确位置。

代码如下

首先需要一个函数确定待排序数组中最大的元素是几,由此来确定桶的下标范围

int maxVal(int* nums, int n) {int max = nums[0];for (int i = 1; i < n; i++) {if (nums[i] > max) {max = nums[i];}}return max;
}
void bucketsort(int* nums, int n) {int max = maxVal(nums, n);//原数组最大值int* bucket = (int*)calloc((max + 1), sizeof(int));//用桶计数,记录元素出现的次数for (int i = 0; i < n; i++) {bucket[nums[i]]++;}int index = 0;for (int i = 0; i < =max ; i++) {while (bucket[i]--) {//计数归零的时候停止nums[index++] = i;}}}

时间复杂度O(n);

空间复杂度O(n);

稳定排序

http://www.lryc.cn/news/334958.html

相关文章:

  • Pandas追加写入文件的时候写入到了第一行
  • 04---webpack编写可维护的构建配置
  • 【云计算】云数据中心网络(一):VPC
  • 自动驾驶中的多目标跟踪_第一篇
  • AI爆款文案 巧用AI大模型让文案变现插上翅膀
  • Python入门的60个基础练习(一)
  • 微软云学习环境
  • 大厂面试:找出数组中第k大的数的最佳算法
  • 爬取高校专业信息的Python爬虫简介与实践
  • redis 集群模式(redis cluster)介绍
  • python实现网络爬虫
  • LeetCode 836. 矩形重叠
  • 为说阿拉伯语的国家进行游戏本地化
  • 【Python系列】读取 Excel 第一列数据并赋值到指定列
  • 二叉树——存储结构
  • LangChain - OpenGPTs
  • pe格式从入门到图形化显示(四)-节表
  • 路由策略与路由控制之双点双向重发布(OSPF-ISIS)实验
  • 9proxy—数据采集工具全面测评
  • 上海晶珩树莓派工业智能机械臂,亮相2024年embedded world博览会!
  • 蓝桥杯——求和
  • 设计模式:责任链模式示例
  • SpringBoot快速入门笔记(4)
  • GoPro相机使用的文件格式和频率
  • Redis Stack 安装部署
  • 【经典算法】LeetCode 5: 最长回文子串(Java/C/Python3实现含注释说明,Medium)
  • 39.Python从入门到精通—parseString 方法 Python 解析XML实例 使用xml.dom解析xml
  • 【蓝桥杯第九场小白赛】(部分)
  • 【Linux】Supervisor 基础
  • 48 全连接卷积神经网络 FCN【动手学深度学习v2】