排序算法

在各类算法问题中,排序算法是最基本的一个问题,在项目中经常遇到一些数据按照从小到大排序或者从大到小的顺序进行排列。对于一个排好顺序的序列来讲,在进行查找最大值,最小值,遍历,计算和求解等各种操作时十分方便。由于本人在开发过程中经常遇到,在此系统的总结一下,在扩充自己的知识体系外,也帮助大家更全面的了解一下排序算法,有不足之处希望大家多多指教。

言归正传,总的来说,排序算法包括基本排序算法多路归并排序。而基本排序算法包括交换排序选择排序插入排序合并排序,其中,交换排序又包括冒泡排序法快速排序法;选择排序包括选择排序法堆排序法;插入排序包括插入排序法Shell排序法。对于一些较大的文件,由于计算机内存有限,往往不能直接将其读入内存进行排序,因此要采用多路归并排序法,将文件划分为几个能够读入内存的小部分,然后分别读入进行排序,经过多次处理便可以完成大文件的排序。

 排序算法的详细介绍(排序对象基本为整数,其他数据类型都类似)

基本排序介绍

 一、交换排序

1、冒泡排序法(BubbleSort)

冒泡排序法的思路是交换排序,通过相邻数据的比较交换来达到排序的目的。冒泡排序法在对N个数据进行排序时,无论数据有无顺序,都需要进行N-1步的中间排序,思路简单直观,但是执行的步骤比较长,效率太低。改进的方法是在每次中间排序之后,比较一下数据是否已经按照顺序排列完成,如果排列完成则退出排序过程,否则继续进行冒泡排序。这样做可以加速算法的执行过程。

冒泡排序法是通过多次比较和交换来实现排序,它的流程如下:

(1)对数组中的各数据,依次比较相邻两个数据的大小;

(2)如果前面的数据小于后面的数据,就交换这两个数据(从大到小排)。经过第一轮的多次比较排序后,便可以把最大的数据排好;

(3)再用同样的方法把剩下的数据进行逐个进行比较,最后便可以按照从大到小的顺序排好数组中各个数据的顺序。

冒泡排序算法的验证代码如下:

//冒泡排序法代码

森之缘——冒泡排序法

 

2、快速排序法(Quick  Sort)

快速排序法和冒泡排序法类似,都是基于交换排序的思想,但是快速排序具有更高的执行效率。快速排序法是通过多次比较和交换来实现的,它的排序流程如下:

(1)首先设定一个分界值,通过该分界值讲数组分成左右两个部分;

(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边;

(3)左边和右边的数据进行独立排序,对于左侧的数组数据,又可以区一个分界值,讲该部分的数据分成左右两个部分,同样在左边放置较小的数据,右边放置较大的数据。

(4)重复上述过程。通过递归将左侧的数据排列好,再通过递归将右侧的数据排列好,当左右两侧各个数据排列完成后,整个数组的排序也就排好了。

快速排序算法的验证代码如下:

//快速排序法代码

森之缘——快速排序法

 

二、选择排序

1、选择排序法(Selection Sort)

选择排序法思路比较直观,在每一步中选取最小值重新排列,从而达到排序的目的。选择排序算法通过选择和交换来实现排序,它的基本流程是:

(1)在原始数据中选取最小的一个数据,将他和位于第一个位置的数据进行交换;

(2)从剩下的N-1个数据中选择次小的一个元素,将他和位于第2个位置的数据进行交换;

(3)不断重复,知道最后两个数据交换完成。最后完成对原始数据从小到大的排序。

选择排序算法的验证代码如下:

//选择排序法代码

森之缘——选择排序法

 

2、堆排序法(Heap Sort)

堆排序法是基于选择排序的思想,利用堆结构和二叉树的一些性质来完成对数据的排序,应用较广泛。堆排序的关键在于构造堆结构。什么是堆结构,我的理解是堆结构就是一种树结构,准确地讲是一个完全二叉树。在这个树中每个节点对应原始数据的一个记录,并且每个节点满足一下条件:

a:如果按照从小到大排序,则要求非叶节点的数据要大于或者等于他的左、右子结点的数据。

b:如果按照从大到小排序,则要求非叶节点的数据要大于或者等于他的左、右子结点的数据。

堆排序法需要反复经过两个步骤:构造堆结构和堆排序输出。

(1)构造堆结构

构造对结构就是原始的无序数据按照对结构的定义进行调整,需将原始的无序数据放置到一个完全二叉树的各个结点中。

(2)堆排序输出

根结点存放的是最大值或者最小值;对除最后一个结点的其他结点重新执行堆构造过程。

堆排序算法的验证代码如下:

//堆排序法代码

 

森之缘——堆排序

 

三、插入排序

1、插入排序(Insertion Sort)

插入排序法是通过对未排序的数据逐个插入合适的位置而完成的排序。

插入排序是通过比较和插入来实现排序的算法,它的基本排序流程如下:

(1)首先对数组的前两个数据进行从小到大排序(或者从大到小);

(2)将第三个数据与排好的两个数据进行比较,将第三个数据插入到合适的位置;

(3)将第四个数据插入到已经排好队的前三个数据中;

(4)不断重复上述过程,直到把最后一个数据插入到合适的位置。

插入排序算法的验证代码如下:

//插入排序法代码

森之缘——插入排序法

 

2、Shell排序法

Shell排序算法是处理大量数据其中的一种算法,严格来讲,他是基于插入排序的思想,又称为希尔排序或者缩小增量排序。他的排序流程如下:

(1)将有N个元素的数组分成N/2个数据来进行排序,第一个数据和第N/2+1个数据为一对,依此类推;

(2)一次循环使每一个序列对排好顺序;

(3)变为N/4个序列,再次排序;

(4)不断重复上述过程,知道序列变为最后一个为止。

Shell排序算法的验证代码如下:

//Shell排序法代码

森之缘——Shell排序法

 

四、合并排序

合并排序法就是将多个有序的数据表合并成一个有序的数据表。如果参与合并的只有两个有序表,简称为二路合并。合并排序 的基本思路是:(1)将含有N个结点的待排序数据序列看成有N个长度为1的有序子表组成,并且将他们两两合并,得到长度为2的若干有序子表;(2)对这些有序子表再进行两两合并,得到长度为4的若干有序子表;(3)不断的重复上述过程,知道最后的子表长度为N。

合并序算法的验证代码如下:

//合并排序法代码

森之缘——合并排序法——一遍合并函数

 

森之缘——合并排序法

 

多路归并排序(后续)

以上是个人对排序算法的总结,有不足之处还望大家多多指出,希望这篇文章能够帮助到大家,完整的测试代码太长,挂到博客中会导致篇幅太长,如有需要,大家可私下留言,留下邮箱,我看到会打包发送过去!谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值