基于C语言排序算法改进与应用
基于C语言排序算法改进与应用
摘 要:介绍了程序语言中排序的原理及应用,阐述了基于C语言的三种主要排序方法,提出了每种排序方法的改进,计算出改进后算法的时间复杂度,编写了每种排序方法程序设计的主要语句,通过实例应用,对每种排序方法的算法改进前后进行对比,证明了改进后算法的优越性。
关键词:C语言;排序;改进;应用 中图分类号:TP312 文献标识码:A 1 引言 我们日常生活中经常会碰到一些需要按顺序排列的情况,诸如大小、高矮等,这些一般都是排列对象数量较小、凭人力在有限的时间内能够完成的任务。本文讨论的排序是面向计算机程序处理的,是计算机程序设计中经常需要进行的一类操作,可以定义为:将一组杂乱无序的记录或数据元素通过一定的方法重新排列为按某个关键字的有序序列[1]。 在计算机程序设计中所使用的排序按所访问的存储器不同可以分为内部排序和外部排序;按相同关键字处理方法的不同可以分为稳定排序和不稳定排序;按计算机需要进行运算的时间复杂度和空间复杂度的大小,可以分为好、平均、差等类别,其时间复杂度和空间复杂度越小代表排序算法占用计算机资源越少,该排序方法就越好[2]。 基于C语言的排序一般有七种:选择排序,插入排序,起泡排序,快速排序,堆排序,归并排序,基数排序,其中最主要的是选择法、插入法、起泡法三种,本文主要就以上三种方法进行讨论。 2 三种排序及其改进方法简述 2.1 选择排序 基本方法:在待排序数据元素中持续选择最大(最小)的元素放在新序列的第一位、第二位……,直到所有数据全部选择完毕。用语言描述排序过程为:第一次从原序列中选择最大的数,放在第一位,第二次从剩下的序列中选择最大的数放在第二位,以此类推,最后将最小的数放在最后一位,从而完成排序[3]。 这种排序存在一个问题:没有考虑原序列的初始排序情况,即使原来的序列元素已经按从大到小排列,程序也必须执行次比较,时间复杂度为,如果原序列元素庞大,就会占用许多系统资源,造成不必要的浪费。 改进方法:在待排列序列中将数据元素两两比对,大者上升,上升的数据元素再次两两比对,大者上升,直到结束。排序过程为:在一棵二叉树上,从底层开始,将数据元素两两比较,选择较大的一个上升,再次将第二层的数据元素进行两两比较,选择较大的一个上升,直到选出最大的一个,放在二叉树顶层,然后将这个最大数所在结点全部清空,再从最底层进行两两比较,依次循环,选出最小的一个,完成排序过程,改进的选择排序又叫树形选择排序或者锦标赛排列。 这种排序方法每选择一个较大元素需要进行比较,其时间复杂度为,相对原来的基本方法,可以节约系统资源。 本算法的主要语句: 2.2 插入排序 基本方法:将待排序的数据元素插入到已经排序的数据序列中,得到一个新的序列,直到所有待排序的元素全部插入完毕。递增排序过程为:首先将待排序序列的第一个元素看作有序序列,将第二个元素拿来与之比较,比其大则插在其后面,反之插在前面;其次再将得到的新序列看作有序序列,将第三个元素拿来从前向后比较,插到比自身大的元素之前,依次插入,直到最后一次元素插入完毕,完成排序过程[4]。 直接插入排序方法每插入一个元素都要从新序列的首部开始,其时间复杂度为,随着待排序元素的增加,其占用的时间和空间就越多,增加系统负担。 改进方法:将待排序的元素插入到已排序的序列中,不是从头开始比较,而是从中间开始比较,确定应该插入在前一半还是后一半中,再从这一半的中间比较,确定更小的一半,最终找到合适的位置插入。 本算法的主要语句: 改进的插入排序又叫折半排序,其空间占用不变,但在时间上减少了元素相互比较的次数,但没有减少元素的移动次数,其时间复杂度仍为。 2.3 起泡排序 基本方法:起泡排序的核心思想是“比较+交换”,两两比较,逆序交换,直到全部比较并交换完毕。递增排序过程为:将前二个元素比较,如果第一个大,则将二个数交换,再进行第二个第三个元素的比较,逆序交换,直到最大的数沉到最后;然后再次从头开始,将前二个元素比较,重复过程,直到第二大的元素沉到倒数第二个位置,如此循环,完成排序过程[5]。 起泡排序的平均时间复杂度为。如果原序列为正序序列,循环比较还是要进行到底,需要N-1次比较,如果待排序元素庞大,会产生不必要的浪费。 改进方法:以标准元素为中心,按大小前后列队,再将前后队伍以此方法按大小列队,最终完成排序。排序过程为:选择待排序序列第一个元素作标准,将其他元素与其比较,小的列前面,大的列后面,然后分别在前后部分内部按上述方法列队,最终完成所有元素的递增排序,改进后的起泡排序可以叫列队排序。 本算法主要语句如下: I