排序算法比較常见的有:冒泡排序、简单选择排序、直接插入排序;希尔排序、堆排序、归并排序和高速排序算法等。

今天先学习一下前面三种比較简单的算法。排序的相关概念:

①排序的稳定性:两个或多个元素相等。排序过后仍然是原来的顺序则为稳定排序。

②内部排序:排序过程都在内存中进行;外部排序:须要对外存进行訪问的排序过程。

③内排序算法性能因素:1、时间性能,比較与移动;2、辅助空间;3、算法复杂性

实例:冒泡排序、简单选择排序与直接插入排序

#include "stdio.h"#define MAXSIZE 6int data[MAXSIZE] = {0,5,4,3,2,1};/*
*   功能:数组元素交换
*   输入:数据、交换元素的下标
*   输出:无
*/
void swap(int data[],int i,int j)
{int temp = data[i];data[i] = data[j];data[j] = temp;
}/*
*   功能:冒泡排序
*   输入:数组
*   输出:无
*   算法:循环一次。下标所在位置即为最小值。不断地比較和移动
*/
void bubble1(int data[])
{for(int i = 0; i < MAXSIZE-1; i++)  for(int j = i+1; j < MAXSIZE ; j++)if(data[j] < data[i])  swap(data,i,j);
} /*
*   功能:改进冒泡排序
*   输入:数组
*   输出:无
*   算法:改进后的算法除了关注当前最小值外,还能够顺便移动其它较小值在前面
*/
void bubble2(int data[])
{int flag = 1;  // 标志位for(int i = 0; i < MAXSIZE-1 && flag; i++){flag = 0;  // 每次循环标志位都赋为0for(int j = MAXSIZE - 1; j > i; j--)if(data[j] < data[j-1])  // 相邻两个元素之前的比較,而不是上面的算法仅仅关注最小值。{swap(data,j-1,j);flag = 1;  // 当有发生移动时。才赋为1,否则排序已经完毕。无需多余的比較。}}
}/*
*   功能:简单选择排序
*   输入:数组
*   输出:无
*   算法:比較记录最小值的下标。最后才移动。而非每次都比較后就移动
*/
void simple(int data[])
{int min = 0;for(int i = 0; i < MAXSIZE-1; i++){min = i;  // 假设第一个下标为最小值for(int j = i+1; j < MAXSIZE; j++){if(data[j] < data[min])  // 当出现比第一个下标小的数据,记录其下标min = j;}if(min != i)  // 假设最小值不是第一个下标才交换swap(data,min,i);}
}/*
*   功能:直接插入排序
*   输入:数组
*   输出:无
*   算法:将数据插入到已经排好序的有序表中,得到记录增1的有序表。

*/ void insertSort(int data[]) { for(int i = 2; i < MAXSIZE; i++) // 第一次循环,排序为data[1],data[2]两个元素,data[0]是哨兵作用 { if(data[i] < data[i-1]) // 假设data[2]比data[1]小。哨兵data[0]设为data[2] { data[0] = data[i]; int j = i; while(data[j-1] > data[0]) // 当data[1] > data[0]时,将其右移即data[2] = data[1] { data[j] = data[j-1]; j--; } data[j] = data[0]; // data[1] = data[0],实现了data[1]和data[2]的交换, // 此时data[1]和data[2]即为排好序的有序表,開始第二次循环 } } } void print(int *data) { for(int i = 0; i < MAXSIZE; i++) printf("%d ",data[i]); printf("\n"); } int main(int argc, char* argv[]) { print(data); // bubble1(data); // bubble2(data); // simple(data); insertSort(data); print(data); }

小结:三种简单排序算法的时间复杂性都是O(n^2),都是稳定的排序。

转载于:https://www.cnblogs.com/yutingliuyl/p/6734327.html

算法:三种简单排序算法相关推荐

  1. JS三种简单排序算法

    冒泡排序:最简单.最慢.长度小于7的时候最优  插入排序:比冒泡要快比快速排序和希尔排序慢,数据量小的时候优势大  快速排序:速度很快  //js利用systemSort进行排序 systemSort ...

  2. 三种简单排序算法---冒泡排序,简单选择排序,直接插入排序

    冒泡排序 核心思想:类似水泡一样,一趟比较,通过相邻元素的交换,冒出当前序列的最小值(最大值)到相应位置 复杂度分析 最好的情况:序列本身有序,只要进行n-1次比较,无需交换,时间复杂度为O(n) 最 ...

  3. 三种线性排序算法 计数排序、桶排序与基数排序-BYVoid

    转自:BYVoid [非基于比较的排序] 在计算机科学中,排序是一门基础的算法技术,许多算法都要以此作为基础,不同的排序算法有着不同的时间开销和空间开销.排序算法有非常多种,如我们最常用的快速排序和堆 ...

  4. 三种线性排序算法 计数排序、桶排序与基数排序—— 转自:BYVoid

    三种线性排序算法 计数排序.桶排序与基数排序 [非基于比较的排序] 在计算机科学中,排序是一门基础的算法技术,许多算法都要以此作为基础,不同的排序算法有着不同的时间开销和空间开销.排序算法有非常多种, ...

  5. 排序算法(01)— 三种简单排序(冒泡、插入、选择)

    一.概述 排序是数据处理中十分常见且核心的操作,虽说实际项目开发中很小几率会需要我们手动实现,毕竟每种语言的类库中都有n多种关于排序算法的实现.但是了解这些精妙的思想对我们还是大有裨益的. 1.1 排 ...

  6. 一学就废的三种简单排序【冒泡、插入、选择】

    文章目录 其他排序算法 冒泡排序 算法实现 代码实例 插入排序 算法实现 代码实例 选择排序 算法实现 代码实例 其他排序算法 一学就废的归并排序 冒泡排序 排列顺序从前到后或者从后往前都可,本文选择 ...

  7. Java 阶乘算法 三种简单实现

    阶乘算法: Java 方法(一) package 第一章; import java.util.Scanner; import java.util.Arrays; public class fact1 ...

  8. 简单选择排序_Python3三种简单排序(冒泡、插入、选择)的比较

    冒泡排序 相邻的两个元素对比,大的数后推,遍历整个列表一次后,将最大项以冒泡的方式排列到列表末尾. 简易版冒泡排序示例如下 def bubble(sl): """ 冒泡排 ...

  9. 数据结构与算法(五)排序算法篇

    排序算法篇 恭喜各位小伙伴来到最后一部分:排序算法篇,数据结构与算法的学习也接近尾声了,坚持就是胜利啊! 一个数组中的数据原本是凌乱的,但是由于需要,我们需要使其有序排列,要实现对数组进行排序我们之前 ...

最新文章

  1. 【前端_js】JavaScript知识点总结
  2. 搞硬件,别吹牛了,好好做个规划!
  3. EdgeBERT:极限压缩,比ALBERT再轻13倍!树莓派上跑BERT的日子要来了?
  4. java 指针 地址压缩_JVM优化之压缩普通对象指针(CompressedOops)
  5. 微软 azure_Microsoft Azure,我们迁移数据的第一步
  6. Coursera心理学课程考试小抄
  7. 学习wordpress模板制作第一天 函数bloginfo
  8. C/C++如何读取整行字符串
  9. sox 转换pcm格式采样率
  10. Frps部署报错:cannot stat ‘frp_0.44.0_linux_amd64/frps‘: No such file or directory
  11. 微信H5页面源码如何看
  12. datagrip连接sqlserve发生[08S01] 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接
  13. Docker -v 对挂载的目录没有权限 Permission denied解决办法
  14. PHP 返回结果给前端/ajax后,在后台继续执行代码的方法
  15. ATFX:小非农不及预期,今晚大非农表现如何?
  16. 基于 Layui 的后台框架模板 layuimini
  17. Linux---wifi驱动移植及调试(SSV6x5x)
  18. 拼字游戏 html5,拼字游戏攻略
  19. 使用哈希函数:H(k)=3k MOD 11,并采用链地址法处理冲突。试对关键字序列(22,41,53,46,30,13,01,67)构造哈希表,求等概率情况下查找成功的查找长度,并设计构造哈希表
  20. 修改IP地址和主机名

热门文章

  1. linux从指定网卡scp文件出去,Linux下nc或scp命令来实现文件传输
  2. python 多条件 选择 算法_Python 子集的算法优化; 找寻一个list的所有满足特定条件的子集...
  3. linux界面设计论文,毕业设计(论文)-基于linux的云校园桌面虚拟化系统的设计与实现.doc...
  4. java url加密解密,java URL 编码解码,该如何解决
  5. java consumer_Java 8 Consumer接口
  6. matlab nargout
  7. 【 FPGA 】UltraFast设计方法学:时序收敛之时序约束基本准则
  8. 变量/值类型/引用类型/常量/枚举
  9. Redhat 7 yum源换成centos的YUM 源
  10. Windows7下安装VC2008绿色版