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










