冒泡排序

  • 核心思想:类似水泡一样,一趟比较,通过相邻元素的交换,冒出当前序列的最小值(最大值)到相应位置
  • 复杂度分析

    • 最好的情况:序列本身有序,只要进行n-1次比较,无需交换,时间复杂度为O(n)
    • 最差情况: 序列逆序,此时需要比较1+2+3+...(n-1)=n(n-1)/2次,并进行等数量级的交换
    • 辅助空间:O(1)
    • 综上,总的时间复杂度为O(n^2)
  • 稳定性:稳定

void bubbleSort(int arr[],int n){//冒泡排序 int flag=true;for(int i=0;i<n-1&&flag;i++){//flag作为标记,若有序,则不用瞎比较 flag=false;for(int j=n-1;j>=i;j--){//i+j=n-1if(arr[j]<arr[j-1]){swap(arr,j,j-1);flag=true; }}}
}

简单选择排序

  • 核心思想:每一趟树立一个数作为靶子,谁比他小,就作为新靶子和剩下的比,最后的靶子就是这一趟最小的值了,然后除去这个数,再剩下的序列中重复此步骤即可
  • 复杂度分析

    • 比起冒泡,最大特点就是:交换移动数据相当少
    • 不管最好最差情况下,比较的次数都是一样多,而交换次数则有差别
    • i趟排序要进行n-i次关键字比较,比较次数为:n-1+n-2+...+1=n(n-1)/2
    • 交换次数:
      • 最好的情况(有序):0
      • 最差情况(逆序):n-1
    • 辅助空间:O(1)
    • 最终时间复杂度为:O(n^2)
  • 稳定性:稳定

  • 性能比冒泡好点

代码如下

#include <iostream>void swap(int *&arr,int i,int j){int temp=arr[i];arr[i]=arr[j];arr[j]=temp;
} void simpleSort(int *arr,int n){//简单选择排序,在n-i+1个记录中选出最小关键字 int i,j,min;for(i=0;i<n;i++){//这里用i<n,当i=n-1时,j的条件不符,不会进入下一个for循环 min=i;for(j=i+1;j<n;j++){if(arr[min]>arr[j]){//这里必须要用arr[min],不能用arr[i] min=j;}}if(min!=i){swap(arr,i,min);}}
}void print(int *arr,int n){for(int i=0;i<n;i++){printf("%d ",arr[i]);}
}
int main(int argc, char** argv) {int arr[]={4,82,56,12,43,61,14};simpleSort(arr,7);print(arr,7);return 0;
}

直接插入排序

  • 核心思想:类似我们斗地主抓牌,第一张摸到直接放手里,第2张开始就要考虑手里的若干张牌的排列顺序了,第2张若比第1张小,则要把第2张放在第1张前面,现有的牌排好序后再抓第3张牌,然后依次比较第3张和第2张,第1张的大小关系,来决定第3张该摆在哪,依次类推,直到把抓到的最后一张牌排好序
  • 复杂度分析
    • 最好的情况(有序):0次移动,比较n-1次,时间复杂度为:O(n)
    • 最差(逆序):比较次数为:1+2+3+...+n-1=(n+2)(n-1)/2,移动次数也达到最大:(n+4)(n-1)/2
    • 若排序记录随机,平均比较和移动次数约为:n^2/4
    • 辅助空间:O(1)
    • 总的复杂度为:O(n^2)
  • 稳定性:`稳定
  • 性能比冒泡和简单选择排序好点`

代码如下

#include <iostream>void swap(int *&arr,int i,int j){int temp=arr[i];arr[i]=arr[j];arr[j]=temp;
}void InsertSort(int *arr,int n){//直接插入排序    int i,j;for(i=1;i<n;i++){//跟摸牌一样,摸到一张就和抓到手的牌比较,然后整理j=i;while(j>0&&arr[j]<arr[j-1]){//摸到的第一张和第0张比大小,排好序 swap(arr,j,j-1);//摸到第2张和第1张比大小,第1张和第0张比 j--;//摸到第3张和第2张比大小,第2张和第1张比大小,第1张和第0张比大小}}
}void print(int *arr,int n){for(int i=0;i<n;i++){printf("%d ",arr[i]);}
}
int main(int argc, char** argv) {int arr[]={12,4,56,8,10,9,41};InsertSort(arr,7);print(arr,7); return 0;
}

注:本文所用图片均来自dreamcatcher-cx大神文章

三种简单排序算法---冒泡排序,简单选择排序,直接插入排序相关推荐

  1. 排序算法——冒泡排序、选择排序、直接插入排序

    1.冒泡排序 一趟排序的过程,将相邻的两个元素进行比较,如果前一个比后一个大,则将两个元素交换--将最大的元素交换到整个数据的最后. 排序的趟数 = 数据元素的个数 = len - 1 #includ ...

  2. 总结c语言基础算法——冒泡排序法和选择排序法

    1.首先无论何种排序方法其最终目的是按要求将所给数据进行排序.而在C语言中可以有很多排序的方法,这里着重介绍的是常用的较为基础和重要的算法--冒泡排序法和选择排序法. 下面将举一个例子进行讲解: 要求 ...

  3. C语言排序(桶排序,冒泡排序,选择排序,插入排序,快速排序)

    参考:C语言五大排序(桶排序,冒泡排序,选择排序,插入排序,快速排序)动态演示 作者:一只青木呀 发布时间: 2020-09-09 20:18:43 网址:https://blog.csdn.net/ ...

  4. js排序算法详解-选择排序

    全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js排序算法详解-选择排序 相对于冒泡排序还有一种类似的方法就是选择排序,顾名思义就是选择性排序,什么意思呢? 这么来理解,假设 ...

  5. 《数据结构与算法》实验:排序算法实验比较——选择排序 堆排序

    <数据结构与算法>实验和课程Github资源 <数据结构与算法>实验:线性结构及其应用--算术表达式求值 <数据结构与算法>实验:树型结构的建立与遍历 <数据 ...

  6. 排序算法六:选择排序之直接选择排序

    排序算法六:选择排序之直接选择排序 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 引言 在我的博文<"主宰世界"的10种算法短评& ...

  7. 排序之冒泡排序、选择排序

    排序之冒泡排序.选择排序 一.选择排序(最简单) 1.原理: 4  3   2   1 第一个数与第二个数比较,4 > 3,互换位置,此时第一个数为3,第一个数在于第三个数比较,如此循环,第一轮 ...

  8. Java常见排序算法之直接选择排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  9. java选择排序代码_Java排序算法总结之选择排序

    本文实例讲述了Java排序算法总结之选择排序.分享给大家供大家参考.具体分析如下: 选择排序的基本操作就是每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部 ...

  10. Java排序算法之直接选择排序

    Java排序算法之直接选择排序 基本过程:假设一序列为R[0]~R[n-1],第一次用R[0]和R[1]~R[n-1]相比较,若小于R[0],则交换至R[0]位置上.第二次从R[1]~R[n-1]中选 ...

最新文章

  1. bzoj3442 学习小组
  2. 预训练时代微调新范式,高性能加速2800%,NLPer赶紧看过来!
  3. 【习题3】数字和数学计算【第4天】
  4. bean加载时调用@value时会出现空指针异常_SpringMVC全局异常处理机制
  5. wxWidgets:wxDynamicLibrary类用法
  6. python 倒排索引 性能_python 实现倒排索引的方法
  7. FreeSql接入CAP的实践
  8. Qt中字符串之间的转换
  9. .Net PetShop 4.0的缓存处理
  10. QML笔记-对QML中信号与槽的进一步认识
  11. Java并发编程实战_不愧是领军人物!这种等级的“Java并发编程宝典”谁能撰写?...
  12. Hexo博客优化之Next主题美化
  13. [声纹识别]语音识别的发展史
  14. android apk自动安装包下载,Android 下载Apk并安装
  15. libusb读取鼠标数据
  16. 无数个骂娘的故事告诉你,千万别做技术合伙人
  17. 记一次天池比赛 - 性能挑战赛道
  18. in memory computing 存内计算是学术圈自娱自乐还是真有价值?
  19. 关于NSDateFormatter年份计算超前问题
  20. 【虚幻引擎】UE4/UE5 材质

热门文章

  1. Linux 命令(256)—— stty 命令
  2. 搭建个人网站(详细教程)
  3. 龙芯3A使用qemu运行MegaCli配置raid卡
  4. ceph 客户端配置
  5. 将excel中的多个sheet合并为一个sheet
  6. 教你一招轻松搞定广告配音
  7. 安装本地Maven和Spring Boot项目流程
  8. 撕裂者cpu三代文件服务器,AMD三代线程撕裂者正式发布:24核起步破万元
  9. JPEG编码原理及文件格式及代码分析
  10. java萌新的进化旅程03