更全的杂志信息网

计算机程序语言中常用排序算法分析研究

更新时间:2009-03-28

0 前言

数据排序是指按一定规则对数据进行整理排列,为数据的进一步处理做好准备。在计算机领域主要使用的数据排序方法根据占用内存的方式不同分为两大类:内部排序方法与外部排序方法[1]。排序算法是为了让无序的数据组合变成有序的数据组合。有序的数据组合最大的优势在于进行数据定位和采用时会非常方便,因为这个数据是有序的,从而在代码设计时会避免很多不必要的麻烦,因为无序数据在推断数据前后关系时会显得很繁琐,因此数据排序算法在计算机处理数据时就变得非常重要,了解并选择一种合适的排序算法可以大大提高工作效率。

1 快速排序算法

快速排序(Quicksort)是对冒泡排序的一种改进。快速排序由C. A. R. Hoare在1962年提出。在平均状况下,排序n个项目要Ο(nlogn)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他算法更快,因为它的内部循环(innerloop)可以在大部分的架构上很有效率地被实现出来[2]。快速排序使用分治法(Divideandconquer)策略来把一个串行(list)分为两个子串行(sub-lists)。

1.1 研究对象 中山市内建筑工人、企业工人和餐饮宾馆服务等三种职业的流动人口。流动人口的定义是指在没有改变原居住地户籍的情况下,到户口所在地以外的地市从事务工、经商、社会服务等各种经济活动的人群,排除旅游、上学、访友、探亲、就医、从军等情况。

1.1 算法原理

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此将整个数据变成有序序列。

1.2 算法步骤

(1)从数列中挑出一个元素,称为“基准”(pivot)。

for(i=size;i>=1;i--)

(3)递归地把小于基准值元素的子数列和大于基准值元素的子数列排序。

递归的最底部情形,是数列的大小为“0”或“1”,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

1.3 算法实现核心代码

if(j == right){//a中还有元素,且全都比b中的大,a[i]还未使用

void Qsort(int a[], int low, int high)

{

int key = a[first]; /*用字表的第一个记录作为枢轴*/

while(first < last)

{

while(first < last && a[last] >= key)

{

--last;

}

a[first] = a[last]; /*将比第一个小的移到低端*/

while(first < last && a[first] <= key)

蚂蚁是地球上最古老的生物之一,几乎遍布地球的各个角落。在将近12000种蚂蚁中,最有趣的大概要数龟蚁了。龟蚁生活在美洲大陆,不同于那些在地面上筑巢的蚂蚁,龟蚁喜欢在被甲虫蛀出的树洞里筑巢。那么问题来了,总会有其他昆虫希望跟龟蚁挤一挤,一起住在这些舒服的树洞里,或者干脆直接把龟蚁的巢穴抢过来自己住。为了对付这些入侵者,龟蚁进化出了像房门一样的头。

{

++first;

}

a[last] = a[first]; /*将比第一个大的移到高端*/

}

高职学校的优势在于校企对接,学校培养出的人才会直接输送到对应的企业中去,因此,高职学校的教育就必须要重视学生的实践能力。为了符合实践需求,高职学校的教材编写就必须要重视实践。传统的高职教材往往都是高深理论的讲解,对于实践操作过程中所需要的操作技巧以及需要重点注意的关键点并没有提及,因此,现代高职教材改革除了高深理论讲解外,还要告诉学生实际操作过程中的重点和难点。为了达到这个目的,在高职教材编写时要邀请高级技工和企业管理人员共同参与,以此确保高职教材培养出的人才能够符合社会需求。

(5)将另一序列剩下的所有元素直接复制到合并序列尾。

作者贡献声明 林仲:收集数据,参与选题、设计及资料的分析和解释;撰写论文;对编辑部的修改意见进行修改。吴荣瀚:参与选题、设计和修改论文的结果结论

Qsort(a, low, first-1);

Qsort(a, first+1, high);

}

2 堆排序

堆是一种特殊的树形数据结构,其每个节点都有一个值,通常提到的堆都是指一颗完全二叉树,根结点的值小于(或大于)两个子节点的值,同时根节点的两个子树也分别是一个堆[3]。堆排序就是利用堆(假设利用大顶堆)进行排序的方法。

2.1 算法原理

将待排序的序列构造成一个大顶堆。此时,整个序列的最大值就是堆顶的根节点。将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素中次大的值。如此反复执行,便能得到一个有序序列了。堆排序的实现需要解决的两个关键问题如下:

(1)将一个无序序列构成一个堆;

实验结果显示,构音障碍训练治疗构音障碍患者有较好的疗效,构音障碍训练联合针灸治疗对构音障碍患者疗效较单纯构音障碍训练疗效更优。

(2)输出堆顶元素后,调整剩余元素成为一个新堆。

2.2 算法步骤

(1)将初始待排序关键字序列(R1,R2,…,Rn)构建成大顶堆,此堆为初始的无须区;

(2)将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,…,Rn-1)和新的有序区(Rn),且满足R[1,2…,n-1]≤R[n];

罗译:I appreciate his ability to act in accordance with the old tradition of learning...[6]65

(3)由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,…,Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2,…,Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。

2.3 算法实现核心代码

采用C++语言进行算法编程,其核心代码如下:

void HeapSort(int *a,int size)

{

if(data[a+i] <= data[b+j]){

BuildHeap(a,size);//建立堆

(2)重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。

{

cout<

}

“重要的是,这些巨噬细胞会发生和许多吸烟者及慢性阻塞性肺疾病患者中的巨噬细胞相似的病理变化。”这项研究的主要研究人员指出,肺泡巨噬细胞属于免疫细胞,能够吞噬和清除灰尘、细菌和过敏源,电子烟蒸汽会损害这些功能。因此,电子烟的危害或许比过去认为的更大。

BuildHeap(a,i-1); //将余下元素重新建立为大顶堆

康美娜说,她将会送我一件有着梦幻色彩的公主裙,她还说我一定美得像一个小公主。这让我遐想了很久,第一次动了想知道康美娜是个什么样子的念头。

HeapAdjust(a,1,i-1); //重新调整堆顶节点成为大顶堆

}

2.2 两组患者疼痛情况对比 干预前,两组患者VAS评分比较,差异无统计学意义(P>0.05)。干预后,观察组患者评分低于对照组(P<0.05)。见表2。

}

3 归并排序

3.1 算法原理

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列,即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并[4]

3.2 算法步骤

(1)申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;

(2)设定两个指针,最初位置分别为两个已经排序序列的起始位置;

(3)比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;

(4)重复步骤3直到某一指针达到序列尾;

a[first] = key; /*枢轴记录到位*/

3.3 算法实现核心代码

采用C++语言对归并排序算法编程,核心代码如下:

void Merge(int* data,int a,int b,int length,int n){

while(i<=length-1 && j<=right-1){

int i;

传统的形状设计方法有:采用点作为设计变量,例如离散的节点或者是几何元素上的辅助控制点;使用提前设置好的几何形状元素的线性组合来描述结构的几何形状,设计变量则选取线性组合的系数;将几何参数作为设计变量,然后定义子程序来实现几何参数与设计单元控制点坐标的关系;如果包含有曲面、曲线,将决定边界曲线、曲面形状的几何参数作为设计变量[6].以上各种方法都存在问题,比如设计变量过多,处理时太过于繁琐,会出现难以描述的几何边界形状,需要编码,需要额外再处理曲线曲面关系等,因此传统的形状优化在实施过程中难度很大.

temp[i+j] = data[a+i];i++;

}

else{

temp[i+j] = data[b+j];

j++;

swap(a[1],a[i]); //交换堆顶和最后一个元素,即每次将剩余元素中的最大者放到最后面

}

利用C++语言实现的算法核心代码如下:

memcpy(temp + i + j, data + a + i, (length - i) * sizeof(int));

}

else if(i == length){

memcpy(temp + i + j, data + b + j, (right - j)*sizeof(int));

探究2 一般地,对于双曲线是其左、右顶点,P是C上异于点A,B的动点,则直线PA与PB的斜率乘积为定值e2-1.

}

这种形式创新创业实验班具有很强的针对性和可操作性,直接邀请者指定学科或专业的著名教师作为教学学生的导师,并实现了研究性教学课程的“精、深、通”,这不仅方便教师的合理配置,而且还方便快速培养专业人才。同时,由于学科和专业的方向性,在课堂上实现开放式系统是可能的。基于学生自愿参与的原则,可以根据自身学习的实际情况灵活地进行分离,最终使学生达到“精、深、通”的水平。

伴有颈动脉斑块的急性缺血性卒中患者急性期血清学相关指标水平的研究 …………………………………………………………… 梁志刚,孙旭文,杨绍婉,等 425

4 算法比较研究

通过一组测试数据来比较分析这三种排序算法。测试的是平均排序时间,数据是随机整数,时间单位是秒(s),如表1所示。

 

1 三种排序算法的比较数据

  

数据规模(Bit)快速排序(s)归并排序(s)堆排序(s)1000万0.751.223.575000万3.786.2926.541亿7.6513.0661.31

从测试结果中可以看出堆排序是最差的。因为每次取一个最大值和堆底部的数据(记为X)交换,重新筛选堆,把堆顶的X调整到位,有很大可能是依旧调整到堆的底部(堆的底部X显然是比较小的数,才会在底部),然后再次和堆顶最大值交换,再调整下来。这样就比较费时,做了许多无用的重复的操作。

归并排序在排序时间上排在第二位。归并排序的时间复杂度为O(nlogn),这是基于比较的排序算法所能达到的最高境界[5]。归并排序是一种稳定的算法(即在排序过程中大小相同的元素能够保持排序前的顺序,3212升序排序结果是1223,排序前后两个“2”的顺序不变),这一点在某些场景下至关重要。归并排序是最常用的外部排序方法(当待排序的记录放在外存上,内存装不下全部数据时,归并排序仍然适用,当然归并排序同样适用于内部排序),但归并排序需要O(n)的辅助空间,而与之效率相同的快排和堆排分别需要O(logn)和O(1)的辅助空间,在同类算法中归并排序的空间复杂度略高。

快速排序在时间上是最优的。 它的优点在于平均性能好,速度快,数据移动少。缺点在于在初始序列有序或者基本有序时,其时间复杂度降为O(n*n),并且该算法是一种不稳定排序算法。

5 结语

三种排序算法各有优缺点,分别适用于不同的场合。从平均性能来说,快速排序最佳,因为所需时间最短,但快速排序在最坏情况下的时间性能不如堆排序和归并排序。数据较多时,归并排序所需时间较堆排序少,但归并排序需要的辅助存储量更大。因此在实际应用中要根据不同的需求选择合适的排序算法。

参考文献

[1] 杨磊,宋涛.基于数组的桶排序算法[J].计算机研究与发展,2007,44(2):341-347.

[2] 赵越,袁野,王国仁.概率XML关键字检索排序算法[J].东北大学学报(自然科学版),2016,37(8):1095-1099.

[3] 冯元瑞.一种改进的计数排序算法[J].电脑编程技巧与维护,2014(22):16-18.

[4] 余冬梅. 一种基于堆的快速排序算法[J].科学技术与工程.2014,14(35):80-83.

[5] 陈洪雁. 大数据高性能排序算法的设计与实现[J].飞行器测控学报,2015(2):120-127.

 
左晓静,谭会君
《漯河职业技术学院学报》2018年第02期文献

服务严谨可靠 7×14小时在线支持 支持宝特邀商家 不满意退款

本站非杂志社官网,上千家国家级期刊、省级期刊、北大核心、南大核心、专业的职称论文发表网站。
职称论文发表、杂志论文发表、期刊征稿、期刊投稿,论文发表指导正规机构。是您首选最可靠,最快速的期刊论文发表网站。
免责声明:本网站部分资源、信息来源于网络,完全免费共享,仅供学习和研究使用,版权和著作权归原作者所有
如有不愿意被转载的情况,请通知我们删除已转载的信息 粤ICP备2023046998号