在一些c語言資料上看到,“冒泡法”排序一般是從最后一個數(shù)據(jù)開始,向地址小的方向相鄰兩個數(shù)據(jù)比較,并按照從小到大或者從大到小排序的一種算法。在數(shù)據(jù)比較、移動的過程中,數(shù)據(jù)的運動,看起來好像水中的氣泡向上運動。故而稱之為“冒泡法”排序。
“冒泡法”排序,在知道數(shù)據(jù)的起始地址、數(shù)據(jù)個數(shù)、數(shù)據(jù)類型后,需要算出最后一個數(shù)據(jù)的地址,并從最后的一個地址開始運算排序。我在想,為什么不能從數(shù)據(jù)的起始地址開始排序呢,如果采用這種“下沉法”排序,還能省去計算數(shù)據(jù)的結(jié)束地址,程序應該會更簡潔。于是自己就試著寫了一下“下沉法”排序的plc程序代碼,并測試通過。
排序環(huán)境:224cpu,從vb1000開始連續(xù)20個整數(shù),從小到大排序。“下沉法”排序算法參考代碼如下:
//******************給外循環(huán)體、內(nèi)循環(huán)體的循環(huán)次數(shù)賦初值***********************
ld sm0.0 //開始執(zhí)行從小到大的排序程序
movw 19, lw2 //給外循環(huán)次數(shù)(數(shù)據(jù)個數(shù)-1)賦初值
movw 19, lw6 //給內(nèi)循環(huán)次數(shù)(數(shù)據(jù)個數(shù)-1)賦初值
//*******************建立外循環(huán)體并定義排序的其實地址*****************************
for lw0, +1, lw2 //for外循環(huán)體循執(zhí)行l(wèi)w2次
movd &vb1000, ac1 //將v區(qū)的起始地址賦給ac1,定義排序的起始地址
//**************建立內(nèi)循環(huán)體并開始進行相鄰的兩個數(shù)據(jù)比較、移動****************
for lw4, +1, lw6 //for內(nèi)循環(huán)體循執(zhí)行l(wèi)w6次
movd ac1, ac2 //把當前ac1里面的地址存儲到ac2里面
+d +2, ac2 //ac2當前地址+2,存入ac2
ldw< *ac2, *ac1 //如果ac2指向的地址里面的內(nèi)容小于ac1指向的地址里面的內(nèi)容
movw *ac1, lw8 //那么將當前兩個地址里面的內(nèi)容互換
movw *ac2, lw10 //如果ac2指向的地址里面的內(nèi)容不小于ac1指向的地址里面的內(nèi)容
movw lw8, *ac2 //那么當前兩個地址里面的內(nèi)容保持不變
movw lw10, *ac1 //如果把小于比較指令改成大于比較指令,那么數(shù)據(jù)就是從大到小排序
ld sm0.0
+d +2, ac1 //ac1當前地址+2,存入ac1
next //跳轉(zhuǎn)到for內(nèi)循環(huán),如果內(nèi)循環(huán)執(zhí)行結(jié)束,程序往下執(zhí)行
//*******************內(nèi)循環(huán)執(zhí)行結(jié)束,進入外循環(huán)執(zhí)行*****************************
decw lw6 //內(nèi)循環(huán)體執(zhí)行結(jié)束,將內(nèi)循環(huán)體的循環(huán)次數(shù)減1
next //跳轉(zhuǎn)到for外循環(huán),如果外循環(huán)執(zhí)行結(jié)束,程序往下執(zhí)行
上面代碼基本采用臨時變量作運算的,其實還可以將其封裝成一個子程序,實現(xiàn)多次調(diào)用。