C语言泡排冒序算浅析
法中刘旭 (
江师范丽等专高学科校数与计算机学科学系 )
【
摘】要泡冒排序算法 C语言常见是排序算法之,一该算法的优点
逻辑是清晰,代码简洁,点缺是时复杂度间高较本文介。绍了统传
0
。每一轮较结束后比,如标果识量变的值为 l,则说明有发没生
数据换交,排序已完经成,不用继续再比较;如果标变量识的为值0,
冒泡排序算
法的基思本想,并算对的改法进行分进析,已降该低
法算的时间复杂度。
说则排明可序未能成,完需进还下一行的比较轮改进后的。算如法下
: u i。d b ub b l P
一
5rI
—。
be tt e r (in t a[】。i n t n)I I为数na组元的素个数
【
键关字】 c语言,法,冒算排泡
序 1.引言
’
f
0r i(咄 i (n -1 i;+ .】
Fla=1g/;/置标识设变薰并赋值为1 F
o (r j= 0;< j一 n1一i;j+ ’){
在
c语言的习学中,学习完程在设计序结以后,构就会遇到 于排序关的问题。常见的排序算有法冒泡序排选、排序择、插入排序、快排速和归序排序并等排序法算本文。主要对统传冒的排序泡法算的算逻辑法和算法实现等进分析,对行传统法算不中必要的循环进行了进改,一在程度定减了算少法循的环次数数据和交换次 ,数从而降了算法的低间时杂度复。 2传.统的冒排序泡算法
i F([ a】> j【aj + l】 )
{
F l a g=日;,,在数据变存,标换变量识赋值日
为te pI; a j【】; a【 1 j a【 j+ 1 】 a【 J+ 1;】 tem p:
}
“} l a g= =
;1
’; 藁榘裾杂鲁 藜譬数 交据换排,序已完成
泡排冒序法算对两相个的数邻进行比较,小较的数“浮”上较, 3 . 每2一轮比较找到当前最大的数,时同时 找当到前的最小大的数“下沉”,对参 比较加的 两相个邻的数据而言, 果如前一个 数比数后一个大,则数交换这个两;数则不用否换交对每一对。相的邻以的两上个算法中,在 一每轮相的邻两数比较 时,都是 第从一两个数进行完次比一后较,最后一个的就数是最的大数,接下来对相对邻数两
中找到较大数,每轮比一较找到只当前比范围的较最除去最一后个数其的他数再次进每一行对相邻的两数个的较比,数。如大果同能时找当前到较比围范的最数,小率可效以高提一最的后数是第便二的大数如果有。n个元素数组的[ a]:n ,倍循环数也可次以大幅减,少相于当在同轮的比较中一,到找一 第一轮逐,个比较 ( [ a1],a[ 2 )], ( [a2] , a[3] ),( a[3], a[ 4] , )个最大‘下沉 到最”后,同时 到找一个最小“数浮上”到最前面。具( a[n— i] a, n] )[最:大 元的素被会移动到 aI ] n上第二。,轮逐体法为:方在找到当轮前比较的大数最后,在进行下一比轮较之个比 ( a较[1] a,[ 2]) ( a,[ 2],a []3), ( a[ 3], a[ 4 )],…,… (a [ n 2], a前从当,轮排前序围范最的后一对邻相的两开始数行相进邻数两[n一 1] );第二大元素会被移到动 a[ n— i] 上以此类,推 ,经过n —I轮的较,比将每次比较结中的果较数小向存前,放直到把最小数把
…交
…
,
比后,较这个n数序排功成。法算码代如下:v
o i d ub b lb e
—
换到第一个位
置原理,和到最大找数存放到最一样后然后根据,标 识变量值判断的是否始开进行下一轮的比较。改进后的法如算下:
ouid bu bbl e
—s
o rt i ( tn a 1 . i n t n l) l n示表教a组的元个数黉
i - O; i
s
0
—
b e t ter ( i n t a[ 】,i n t n //)n为数组 a的元个数
{素
{
F o r( i=:0 i
F
o r (
{
,
,每—轮 b鞍前n一E1 - i个 p胡邑}痔好的最i后个不E用 较
FO (r
{ {
fD r g ( j =。 0;; j n驾一( 1要 1一考; j” )莠/ 蓣, 从第堡一对始开比始较, 到最拭大值
{
J
-o; j
i F(a[ 1ja>【J 1+ l】{
i
f ( a[J>】a J[+ l 1 't
e mp-£ j】; af j 1 [ aJ *lk
F la;g; 0//存在据数换变标,变量赋识为值 0
t me p a【 j】; a j【】= a【j 1】+ a【;j’ 1】一 t em p;
'
k n=一1- i:
a( J+ l l- t e砷
};’ ’
Fi( a[ k] a
{
小l F a=g0;
}
3算.的法改进 3 . 若排1序提前完 成,减少不必要的循环上述法中算若数,包含组个元n,素那么必须进 n行一 1轮比 。在较多情数况下, n个对数进行序排,并一定要进不行n l~轮
}比
t em=pa k】【; a【 k Ia £k 1一】: a【 一k 1】;te m p;
' '
“l a g=  ̄l
;
’;;蓁颦器 备棠譬凑 数据交换排序已莞 成
)
较
。例对如5 8 9 1 23这个六数行排序,进只需进行要3轮比较就可以排序功成,而需不进行 5要比轮较。说这在明第 n-1轮比较经上过述进,改算在法每一轮较的效比上提率高一倍了但。值前,就有可能完成排,因序,此可对以上算述法进改进。改进行突的注得意的,是改的主要进果是效少减了环循次数,对于据数换次破点交在果排如序在第~nl轮比前较经已完成,则再不进行续后比数而言 并,有减没少。较,可减少 循环次数。具体方法是:设 一置个量变来标识 前轮当的 结束 4语
比是否存较在据数交的换情况,如存果数据在交,则说换明序可排传统冒的泡序算法代码简排洁,能稳性定,通上述过的进改, 能仍完未成,本轮比较结后继续束下一轮比较, 果如存在数不交据可减以少循环次的数提,高算法的效率 但,总体言其而时间复度杂换,则说明当前轮较时比,排 已序完经成,不用再继续进行后续的 仍较然高为 n2,冒泡排序法适算用于规较模小排序的。 较。比在每轮一比较开时,始给识标量赋值变为 1,然后在每轮一的 考参献文: 两相邻两的数较时,比果如在存数据交,换则将标识变量的值改为[ 1]蔚敏严数.据构[结M] .清华大学出社,版19 9 7, 4