Ⅰ c語言先排序後折半查找程序的實驗報告
1實驗目的:熟練掌握一維數組,二維數組的定義,初始化和輸入輸出方法;熟練掌握與數組有關的常用演算法(如查找,排序等)。
2實驗內容:設定一個整形數組存放20個元素,用直接賦值的方法在程序中初始化該數組。先對這些無序的數據進行排序,然後採用折半查找,把要尋找的數的位置輸出出來。
3演算法描述流程圖
源程序:#include<stdio.h>
void main()
{int k,s,b,i,j,m,n,a[20]={12,9,16,21,6,11,19,4,8,20,15,2,5,18,14,7,3,10,13,17};
for(s=0;s<20;s++)
{
for(i=s+1;i<20;i++)
{
if(a[s]>a[i])
{
j=a[s];
a[s]=a[i];
a[i]=j;
}
}
}
scanf("%d",&b);
m=0;
n=19;
while(m<=n)
{
k=(m+n)/2;
if(b==a[k])
{
printf("FOUND\n");
printf("%d\n",k+1);
break;
}
else
{
if(b<a[k])
n=k-1;
else
m=k+1;
}
if(m>n)
printf("NO FOUND");
}
}
5測試數據:3,5, 20,30
6運行結果:FOUND 2;FOUND 4;FOUND 19 ;NO FOUND
7出現問題及解決方法:編譯時出錯,修改源程序,直到沒有錯誤為止
8實驗心得:通過折半查找,可以實現對數組數據的處理,並且增加了查找速度
Ⅱ 使用單片機匯編語言冒泡法排序
一、實驗要求
給出一組隨機數,將此組數據排序,使之成為有序數列
二、實驗目的
1.了解數據排序的簡單演算法。
2.了解數列的有序和無序概念
三、實驗說明
有序的數列更有利於查找。本程序用的是「冒泡排序」法,演算法是將一個數與後面的
數相比較,如果比後面的數大,則交換,如此將所有的數比較一遍後,最大的數就會在
數列的最後面。再進行下一輪比較,找出第二大數據,直到全部數據有序。
四、程序框圖
Size equ 10 ; 數據個數
Array equ 50h ; 數據起始地址
Change equ 0 ; 交換標志
Sort:
mov r0, #Array
mov r7, #Size-1
clr Change
Goon:
mov a, @r0
mov r2, a
inc r0
mov B, @r0
cjne a, B, NotEqual
sjmp Next
NotEqual:
jc Next ; 前小後大, 不交換
setb Change ; 前大後小, 置交換標志
xch a, @r0 ; 交換
dec r0
xch a, @r0
inc r0
Next:
djnz r7, Goon
jb Change, Sort
ljmp $
end
引自:偉福單片機開發平台軟體實驗
Ⅲ 單片機排序程序
MOV R5,#16
MOV R6,#40H
LONG:
MOV R4,#15;16個數比較15次
MOV A,30H;將30H裡面的內容復給A
MOV R0,#31H;讓其從31H開始自加到3FH
L:
SUBB A,@R0;31H裡面的內容和30H裡面的內容進行相減比較求C
JC XU;如果C=0則表示A裡面的內容大於@R0裡面的內容否則小於跳轉XU
INC R0;R0加1到下一單元地址
DJNZ R4,L;15次比較沒有結束跳轉到L繼續執行
AJMP LL;如果15次循環完畢則求出最大值,然後再循環求出次大值
XU:
MOV A,R0;放比較數的地址送A,以清零方便為第二次比較
MOV R1,A;方便清零
MOV A,@R0;最大值送A
INC R0
AJMP LL
LL:
MOV @R1,#00H;最大值地址清零,然後再比較15次求次大值
MOV R6,A;最大值送40H
INC R6
DJNZ R5,LONG;判斷是否全部從大到小排完
AJMP TT
TT:
END