C语言入门——排序

排序的方法有很多种比较常见的便为:冒泡排序、选择排序、插入排序、快速排序。

今天我们就围绕着四种排序来说,如果有兴趣的话可以去查找一下其他排序。

在排序这方面我们主要讨论:

  • 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。
  • 不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。
  • 时间复杂度:对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。
  • 空间复杂度:是指算法在计算机

一、冒泡排序

冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

算法描述:冒泡排序主要比较相邻元素之间大小,从第一个元素开始比较,将较大的元素不断向后移动,然后重复此操作,注意最后一个元素不需此操作。

算法演示图:

代码实现:

void bulletSort(int arr[], int len)//冒泡排序
{int temp = 0;//作为交换的中间变量for (int i = 0; i < (len - 1); i++){for (int j = 0; j <( len-i-1); j++){if (arr[j]>arr[j + 1]){temp = arr[j+1];arr[j + 1] = arr[j];arr[j] = temp;}}}
}

二、选择排序

选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

算法描述:定义一个变量min,然后从数组中找到最小值赋值给min,然后交换a[i]与min的值。

算法演示图:

void selectSort(int arr[], int len)
{int min;int temp = 0;for (int i = 0; i < len - 1; i++){min = i;for (int j = i + 1; j < len; j++){if (arr[j]<arr[min])min = j;}temp = arr[i];arr[i] = arr[min];arr[min] = temp;}
}

三、插入排序

插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

算法描述:从第一个元素开发就已被标记,然后将后面一个作为交换元素,将如果后面一个元素小于前面一个元素的话,那么将元素不断的向左边移动。

算法演示图:

代码实现:

void insertSort(int arr[], int len)
{int temp = 0;int j = 0;for (int i = 1; i < len; i++){j = i - 1;temp = arr[i];while(j >= 0 && arr[j]>temp){arr[j+1] = arr[j];j--;}arr[j + 1] = temp;}
}

四快速排序:

快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

算法描述:前面的三种排序相对于简单,后面这一种快速排序就得浪费点脑力了,快速排序由C. A. R. Hoare在1962年提出。快速排序是对冒泡排序的一种改进,采用了一种分治的策略。通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

算法演示图:

代码实现:

void quickSort(int arr[], int left, int right)
{if (left >= right)return;int i = left, j = right, temp;while (i < j){while (i < j&&arr[left] < arr[j])j--;while (i<j&&arr[left]>=arr[i])i++;if (i < j){temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}//跳出循环则说明i==jtemp = arr[left];arr[left] = arr[i];arr[i] = temp;quickSort(arr, left, i - 1);quickSort(arr, i+1, right);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/545944.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】eclipse技巧1

2019独角兽企业重金招聘Python工程师标准>>> 俗话说的好啊&#xff0c;“工于利启事&#xff0c;必先善其器”&#xff0c;如果说你的编程功底是一个枪法的话&#xff0c;那么强大的eclipse就是android战士们最好的武器。 这里&#xff0c;我们来总结eclipse的使用技…

Java LinkedList公共int indexOf(Object o)方法(带示例)

LinkedList公共int indexOf(Object o)方法 (LinkedList public int indexOf(Object o) method) This method is available in package java.util.LinkedList.indexOf(Object o). 软件包java.util.LinkedList.indexOf(Object o)中提供了此方法。 This method is used to return …

定时任务最简单的3种实现方法(超好用)

这是我的第 86 篇原创文章作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;定时任务在实际的开发中特别常见&#xff0c;比如电商平台 30 分钟后自动取消未支付的订单&#x…

C语言入门基础——Brute-Force算法

Brute-Force算法的基本思想是&#xff1a; 1) 从目标串s 的第一个字符起和模式串t的第一个字符进行比较&#xff0c;若相等&#xff0c;则继续逐个比较后续字符&#xff0c;否则从串s 的第二个字符起再重新和串t进行比较。 2) 依此类推&#xff0c;直至串t 中的每个字符依次和…

MFC:2个重载中没有一个可以转换所有参数类型

MFC:2个重载中没有一个可以转换所有参数类型用VS2008&#xff0c;在使用AfxMessageBox函数的时候出现以上错误&#xff0c;代码如下&#xff1a;AfxMessageBox("Here is the information!",MB_ICONINFORMATION);解决办法一&#xff1a;一、 AfxMessageBox(_T("H…

SQL随机生成6位数字

SELECT RIGHT(100000000 CONVERT(bigint, ABS(CHECKSUM(NEWID()))), 6)

为什么劝你放弃Maven?看看Gradle的这些优点就知道了

相信使用Java的同学都用过Maven&#xff0c;这是一个非常经典好用的项目构建工具。但是如果你经常使用Maven&#xff0c;可能会发现Maven有一些地方用的让人不太舒服&#xff1a;Maven的配置文件是XML格式的&#xff0c;假如你的项目依赖的包比较多&#xff0c;那么XML文件就会…

解决问题手册(QT+C++ )

目录前言QTQT介绍QMutexLockerQTimer与事件循环C介绍工作日记介绍2022前言 刚刚参加工作&#xff0c;感觉自己不懂的地方很多。所以我希望做一篇长时间的文章分享&#xff0c;把我工作中遇到的问题还有解决问题的思路都记下来。时间长了它是不是就变成了一本解决问题手册&…

css中的换行符_如何使用CSS防止项目列表中的换行符?

css中的换行符Introduction: 介绍&#xff1a; Dealing with various items in CSS sometimes pose very different problems. The problem could be anything, it could be related to positioning, arrangement, and whatnot, therefore all such kinds of problems require…

Java中的一些坑,汇总篇(2万字)

Photo Drew Farwell 文 | 常意1.前言

VB.NET判断一个路径的文件是否存在

使用文件系统操控文件和路径的能力是任何程序的一个重要功能。在本文所介绍的技巧中&#xff0c;我们将检测VB.NET 如何与文件系统进行作用。通过现有类、方法和属性示例给出简便方法完成必须的功能。为了能够操作文件系统&#xff0c;我们需要用到System.IO命名空间。因此&…

6款html5模板下载

http://www.100sucai.com/code/1316.htmlhttp://www.100sucai.com/code/1318.htmlhttp://www.100sucai.com/code/1310.htmlhttp://www.100sucai.com/code/1309.htmlhttp://www.100sucai.com/code/1303.htmlhttp://www.100sucai.com/code/1301.html转载于:https://blog.51cto.co…

QMutexLocker用法

QMutexLocker 详细描述:QMutexLocker类是一个方便的类&#xff0c;它简化了锁定和解锁互斥锁。在复杂函数和语句或异常处理代码中对QMutex进行锁定和解锁是容易出错的&#xff0c;很难调试。在这种情况下可以使用QMutexLocker来确保互斥锁的状态总是定义良好的。应该在需要锁定…

软件工程生命周期模型_软件生命周期模型比较| 软件工程

软件工程生命周期模型软件生命周期模型 (Software Lifecycle Models) There are five software lifecycle models that are commonly used while developing any software. These are as follows: 开发任何软件时&#xff0c;通常使用五个软件生命周期模型。 这些如下&#xff…

VB 日期时间函数

1.date(日期表达式)将日期表达式转换成日期类型的数据。日期表达式是任何可以解释成日期的表达式&#xff0c;包含日期文字&#xff0c;可以看作日期的字符串以及从函数返回的日期。比如&#xff1a;myDate CDate("99-5-20") &#xff0c;这样的日期表达式必须加双引…

高并发系统 3 大利器之缓存

引言随着互联网的高速发展&#xff0c;市面上也出现了越来越多的网站和app。我们判断一个软件是否好用&#xff0c;用户体验就是一个重要的衡量标准。比如说我们经常用的微信&#xff0c;打开一个页面要十几秒&#xff0c;发个语音要几分钟对方才能收到。相信这样的软件大家肯定…

QTimer与事件循环理解

问题分析 最近在使用QT的时候发现了某些问题&#xff0c;查阅资料最后总结一下。我起初是想用QT在界面还在加载时加载一副动画&#xff0c;然后动画下面有加载的滚动条代表时间&#xff0c;由于测试所以界面加载没写很多东西很快就加载完成了。我就想让他加载慢点我看看效果。…

MYSQL 数学运算符问题

背景&#xff1a; 在mysql中 ’stringA stringB 这种类型的操作&#xff0c;在mysql内部会自动转化为两个double 数进行运算。 -------------------------------------------------------------------------------------------------------------------------------- 例子&a…

C语言 链表

// LinkTable.cpp : Defines the entry point for the console application. // 程序运行&#xff0c;用户输入学生数&#xff0c;根据用户输入学生数&#xff0c;动态创建链表&#xff0c;提示输入学生 // 姓名、成绩&#xff0c;最后输出所有学生数据以及平均成绩 #include &…

Python | 重命名现有文件(os.rename()方法的示例)

重命名现有文件 (Renaming an existing file) To change the name of an existing file – we use "rename()" method of "os" module – so to access the "rename()" method, we must have to import the module "os". 要更改现有文…