1. 程式人生 > >資料結構與演算法 -排序

資料結構與演算法 -排序

選擇排序         是每一次從待排序的數中找出最小的數,順序放到陣列前面,直道全部資料排序完畢。

此排序方法和氣泡排序不一樣。氣泡排序是將相鄰數依次兩兩比較,比較一次就要進行一次交換。交換佔用時間較多。

此演算法 每次遍歷,只選擇最值元素進行交換,這樣一次遍歷,只需進行一次交換即可,從而避免了其它無價值的交換操作。每次比較只記錄了數在陣列中的位置,並沒有交換。只有在最後一次進行了交換。

注意:比較次數。






<pre name="code" class="plain">               for (int pass=0;pass<intArray.length-1;pass++)
{//外層迴圈次數, a=pass;for(int i=pass+1;i<intArray.length;i++){//內層迴圈,比外層迴圈的數多1if(intArray[a]>intArray[i]){ a=i;}} int b=intArray[pass];intArray[pass]=intArray[a];intArray[a]=b;}
 
 

			

最近在學習嵌入式彙編,感覺好麻煩。附上彙編程式:

選擇排序         
是每一次從待排序的數中找出最小的數,順序放到陣列前面,直道全部資料排序完畢。
此排序方法和氣泡排序不一樣。氣泡排序是將相鄰數依次兩兩比較,比較一次就要進行一次交換。交換佔用時間較多。
此演算法 每次遍歷,只選擇最值元素進行交換,這樣一次遍歷,只需進行一次交換即可,從而避免了其它無價值的交換操作。
每次比較只記錄了數在陣列中的位置,並沒有交換。只有在最後一次進行了交換。
注意:比較次數。

AREA select,CODE,READONLY
    ENTRY
START
    MOV R0,#4
    MOV R7,#0
    LDR R1,=DES
    MOV R2,#0   ;外層迴圈計數
    MOV R5,#1   ;記憶體迴圈計數
    BL LOOP1
STOP
    MOV     r0, #0x18           ; angel_SWIreason_ReportException
    LDR     r1, =0x20026        ; ADP_Stopped_ApplicationExit
    SWI     0x123456            ; ARM semihosting SWI



LOOP1
    LDR R3,[R1,R7]             ;載入第一個數
    ADD R0,R7,#4


    LDR R6, [R1,R7]            ;總是存放最小數

LOOP2   

    LDR R4,[R1,R0]
    CMP R6,R4
    LDRGT R6,[R1,R0]            ;若第一個數比第二個數大,把第二個數放到r6中

    MOVGT R8,R0




    ADD R5,R5,#1
        ADD R0,R0,#4

    CMP R5,#5;比較內層迴圈次數

    BLT LOOP2;若未完成,繼續迴圈,否則交換
    CMP R6,R3
    STRNE R3,[R1,R8]
    STR R6,[R1,R7];把最小值R6給第一個數  
    ADD R2,R2,#1;外層迴圈次數加一
    ADD R7,R7,#4;指向下一個數
    MOV R5,R2
    ADD R5,R5,#1
    CMP R2,#4
    BLT LOOP1;未完成,繼續迴圈
    MOV     pc,lr   




    AREA Array1,DATA,READWRITE
DES DCD 3,4,3,2,1
    END             ;35416

組合語言程式碼根據上面java寫出,先把java語言寫出來,然後對照寫出  注意各個暫存器。
每條命令可以按條件執行。就像高階語言中的if語句
例如:movne r0,r1 ltrne r0,[r1,#4] 等都可以按條件執行