数据结构与算法 -排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/p1126500468/article/details/50096987

选择排序         是每一次从待排序的数中找出最小的数,顺序放到数组前面,直道全部数据排序完毕。

此排序方法和冒泡排序不一样。冒泡排序是将相邻数依次两两比较,比较一次就要进行一次交换。交换占用时间较多。

此算法 每次遍历,只选择最值元素进行交换,这样一次遍历,只需进行一次交换即可,从而避免了其它无价值的交换操作。每次比较只记录了数在数组中的位置,并没有交换。只有在最后一次进行了交换。

注意:比较次数。






<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] 等都可以按条件执行



猜你喜欢

转载自blog.csdn.net/p1126500468/article/details/50096987