这是我第一次写文章,想要记录自己的学习生活,写得不好请包涵or指导,本来想一口气写好多种,后来发现,写太多的话反而可读性不强,而且,我文笔,知识有限呐。慢慢来吧

目录

名称 冒泡排序 直接选择排序 直接插入排序 希尔排序
时间复杂度 O(n^2) O(n^2) O(n^2) O(n^(1.3-2)

ps.没有讲到稳定性和空间复杂度。

冒泡排序

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。
它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。

  • 时间复杂度大约为O(n^2),可进行一些优化
    这应该是c语言课程里头第一次讲到的排序算法,可以说得上是所有排序算法里头最简单的算法了。
  • 思想:按一定的顺序,比如要求从大到小进行排序,那么第一位到最后一位(也可从最后一位到第一位)依次进行多次比较
  • 这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

代码实现(未优化版本)

 1//这里按从小到大排序
2for(int i=0;i<n;i++)//比较n轮
3for(int j=0;j<n,j++)//n轮中每一轮比较n次
4{
5  if(a[j]>a[j+1])
6  {
7    temp=a[j];
8    a[j]=a[j+1];
9    a[j+1]=temp;
10  }
11} 

代码实现(优化版本)

 1for(int i=0;i<n;i++)//比较n轮
2for(int j=0;j<n-i;j++)//每一轮比较n-j次
3{
4  if(a[j]>a[j+1])
5  {
6    temp=a[j];
7    a[j]=a[j+1];
8    a[j+1]=temp;
9  }
10}

为什么可以这样优化呢?这就需要从机理来研究了,由于冒泡是每一次选出的是每一轮中的最大(小)的数,那么下轮开始,我们就不需要再将未排序的数再与已经排序的数进行比较了!
这里希望大家重视一下优化的版本,优化过后,时间复杂度会低些,这样程序运行时间就会减少,虽然在冒泡这里体现并不明显,但随着学习的深入,你会逐渐发现,算法的优劣(时间复杂度&&空间复杂度),对一个程序而言很重要,特别是在信息学竞赛中(才不会用冒泡这种低端算法呢)

02.直接选择排序

直接选择排序(Straight Select Sorting)
也是一种简单的排序方法,它的基本思想是:第一次从R[0]R[n-1]中选取最小值,与R[0]交换,第二次从R[1]~R[n-1]中选取最小值,与R[1]交换,….,第i次从R[i-1]~R[n-1]中选取最小值,与R[i-1]交换,…..,第n-1次从R[n-2]R[n-1]中选取最小值,与R[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列。

  • ps.其实并不一定是从小到大,也可从大到小。 选择排序的时间复杂度也是O(n^2)

  • 思想:也是和冒泡一样,进行多轮比较,但不一样的地方在于,经过每一次比较之后,每一轮会确定一个最小(大)的数对应的位置,最后才进行一次交换,相比之下,冒泡是一直在交换,事实上,冒泡和直接选择排序一样,比较低端,能不用尽量不用,尤其对长度较大的数组。

    代码实现

 1content_copy
2int temp;
3for(int i=0;i<n-1;i++)
4{
5  int k=i;
6  for(int j=i+1;j<n;j++)
7    if(a[j]<a[k])
8    k=j;//每一轮中选出最小的数组元素对应的下标
9temp=a[k];
10a[k]=a[i];
11a[i]=temp;
12}

动态图解

在这里插入图片描述
03.直接插入排序

直接插入排序(Straight Insertion
Sort)是一种最简单的排序方法,其基本操作是将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表。

  • 直接插入排序的时间复杂度还是O(n^2)
  • 思想:每次选择一个元素,将这个元素与数组中该元素之前所有的元素进行比较,然后将它插到合适的位置。

代码实现

1    int i,j,temp;
2    for ( i = 1; i < n; i++) {
3         temp = a[i];//每一轮选出一个元素
4        for ( j = i; j > 0 && a[j - 1] > temp; j--) {
5            a[j] = a[j - 1];//与前面的元素比较大小,然后插进去,后面的元素退一位
6        }
7        a[j] = temp;
8    }

动态图解

在这里插入图片描述
04.希尔排序

希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment
Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L.Shell于1959年提出而得名。
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。
但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。

  • 在某些极端情况下,希尔排序的时间复杂度会达到O(n^2)

  • 希尔排序的平均时间复杂度是O(n^(1.3—2))
    思想:直接插入排序要进行多次的比较交换,如果说,一个数组中大部分元素都处于有序的状态下,那么就不需要进行多次的比较和交换了。那么就需要先对数组进行一定的处理。

  • 以下是希尔增量下的希尔排序,关于希尔排序的增量,有很多种选择,例如Hibbard增量,这些增量有些是通过数学证明得到的,有些则是还没有得到证明的,人们确信正确的经验得出的。。个人感觉有点像孪生素数猜想那样的吧,但证明难度应该没有那么高。

代码实现

 1  for (int gap= n/2; gap > 0; gap /= 2)//分组
2    {
3        for (int i = gap; i < n; i ++ )
4        {
5            int temp = a[i];
6            int j;          //这里基本上和插入排序差不多
7            for (j = i; j >= gap && a[j - gap] > temp; j -= gap)
8                a[j] = a[j - gap];
9            a[j] = temp;
10        }
11    }

图解

  • ps.希尔排序的动图我在网上找不到,只能用图片代替了
    对于这样的一个数组,进行分组,gap=n/2,然后每分好之后,再gap/=2,一直到gap=1,这个过程使得数组的整体有序性提高,从而使直接插入排序的工作量减少很多.
    在这里插入图片描述
    对于其它增量实现的,这里不贴出来了,因为,我不会写唉(逃

最后,这是我第一次写博客,很多东西,如markdown语法什么的都不太会,我本来在编辑器上写好的了,然后复制过来乱码了,只能一段一段复制粘贴,希望大家包涵,如有错误,请指正,万分感谢!
图片来源于网络,侵删!

[answerer的算法课堂]简单描述4种排序算法(C语言实现)的更多相关文章

  1. 用 C 语言描述几种排序算法

    排序算法是最基本且重要的一类算法,本文基于 VS2017,使用 C 语言来实现一些基本的排序算法. 一.选择排序 选择排序,先找到数组中最小的元素,然后将这个元素与数组的第一个元素位置互换(如果第一个 ...

  2. java算法03 - 常用的8种排序算法

    Java常用的八种排序算法: 插入排序 - 直接插入排序 每次将待排序的记录按照关键字的大小,插入到前面已经排好序的记录的适当位置.直到全部记录插入完成. 代码实现 /** * 直接插入排序 O(n^ ...

  3. 几种排序算法的学习,利用Python和C实现

    之前学过的都忘了,也没好好做过总结,现在总结一下. 时间复杂度和空间复杂度的概念: 1.空间复杂度:是程序运行所以需要的额外消耗存储空间,一般的递归算法就要有o(n)的空间复杂度了,简单说就是递归集算 ...

  4. 数据结构(三) 用java实现七种排序算法。

    很多时候,听别人在讨论快速排序,选择排序,冒泡排序等,都觉得很牛逼,心想,卧槽,排序也分那么多种,就觉得别人很牛逼呀,其实不然,当我们自己去了解学习后发现,并没有想象中那么难,今天就一起总结一下各种排 ...

  5. JavaScript实现的7种排序算法

    所谓排序算法,即通过特定的算法因式将一组或多组数据按照既定模式进行重新排序.这种新序列遵循着一定的规则,体现出一定的规律,因此,经处理后的数据便于筛选和计算,大大提高了计算效率.对于排序,我们首先要求 ...

  6. 学习Java绝对要懂的,Java编程中最常用的几种排序算法!

    今天给大家分享一下Java中几种常见的排序算法的Java代码 推荐一下我的Java学习羊君前616,中959,最后444.把数字串联起来!     ,群里有免费的学习视频和项目给大家练手.大神有空时也 ...

  7. C#常用8种排序算法实现以及原理简介

    public static class SortExtention { #region 冒泡排序 /* * 已知一组无序数据a[1].a[2].--a[n],需将其按升序排列.首先比较a[1]与a[2 ...

  8. 8种排序算法 Java实现

    冒泡排序 O(n2) 两个数比较大小,较大的数下沉,较小的数冒起来. public static void bubbleSort(int[] a) { //临时变量 int temp; //i是循环次 ...

  9. Java 的八种排序算法

    Java 的八种排序算法 这个世界,需要遗忘的太多. 背景:工作三年,算法一问三不知. 一.八种排序算法 直接插入排序.希尔排序.简单选择排序.堆排序.冒泡排序.快速排序.归并排序和基数排序. 二.算 ...

随机推荐

  1. 新闻实时分析系统-Hadoop2.X分布式集群部署

    (一)hadoop2.x版本下载及安装 Hadoop 版本选择目前主要基于三个厂商(国外)如下所示: 1.基于Apache厂商的最原始的hadoop版本, 所有发行版均基于这个版本进行改进. 2.基于 ...

  2. 基于 Vue3.0 Composition Api 快速构建实战项目

    Quick Start 项目源码:https://github.com/Wscats/vue-cli 本项目综合运用了 Vue3.0 的新特性,适合新手学习

  3. VLAN实验4(在eNSP上利用单臂路由实现VLAN间路由)

    原理概述: 以太网中,通常会使用VLAN技术隔离二层广播域来减少广播的影响*并增强 网络的安全性和可管理性.其缺点足同时也严格地隔离了不同VLAN之间的任何二层流量,使分属于不同VLAN的用户 不能直 ...

  4. 修改PHP上传文件大小限制

    1. 在php.ini中,做如下修改: file_uploads = on upload_tmp_dir = /home/upload upload_max_filesize = 4000M post ...

  5. 文件上传之靶场upload-labs (1-10)

    第一关 sj 绕过 源码如下: lasIndexOf是返回函数最后一次出现的地方(从右到左) substring是用来截取函数的 indexOf是返回 表示从.出现的地方开始截取并判断是否在允许的字符 ...

  6. Cannot read property 'nodeType' of null; audio元素默认样式下载按钮

    1.chrome-->console抛出如下错误: Uncaught TypeError: Cannot read property 'nodeType' of null 错误原因:从stack ...

  7. luogu CF16E Fish

    题目描述 有n条鱼,编号从1到n,住在湖里.每天有一对鱼相遇, 彼此相遇的概率是一样的.如果两条标号为i和j的鱼见面,第一只吃了第二只的概率为a{i,j},第二只会吃了第一只的概率为a{j,i}=1- ...

  8. luogu P1938 [USACO09NOV]找工就业Job Hunt

    题目描述 奶牛们正在找工作.农场主约翰知道后,鼓励奶牛们四处碰碰运气.而且他还加了一条要求:一头牛在一个城市最多只能赚D(1≤D≤1000)美元,然后它必须到另一座城市工作.当然,它可以在别处工作一阵 ...

  9. AQS系列(二)- ReentrantLock的释放锁

    前言 在AQS系列(一)中我们一起看了ReentrantLock加锁的过程,今天我们看释放锁,看看老Lea那冷峻的思维是如何在代码中笔走龙蛇的. 正文 追踪unlock方法: public void ...

  10. Apache Maven从入门到升天

    喜欢就点个赞呗! GitHub项目JavaHouse同步收录 1 引入 在日常 Java 开发中,Maven 应该是必不可少的一个工具了,当然也有人使用 Gradle 的.那么 Maven 究竟是个啥 ...