:
ORG 0030H
MOV 30H, #34H
MOV 31H, #56H
MOV 32H, #23H
MOV 33H, #90H
MOV 34H, #32H
MOV 35H, #68H
MOV 36H, #09H
MOV 37H, #75H
CALL SORT
SJMP $
;-----------------------------------------------------
SORT: ;最简短、高效的排序程序
MOV B, #7 ;第一轮排序时,比较7次
S1: MOV R0, #30H ;数据区的起始地址
MOV R7, B
CLR PSW5 ;清除"交换"标志位
S2: MOV A, @R0 ;取前一个数
INC R0
CLR C
SUBB A, @R0 ;减后一个数,前<后时,Cy=1
S3: JC S4 ;有借位时,不用交换,转移
MOV A, @R0 ;取后一个数,准备交换
DEC R0
XCH A, @R0 ;交换到前一个
INC R0
XCH A, @R0 ;交换到后一个
SETB PSW5 ;设定"交换"标志位
S4: DJNZ R7, S2 ;继续本轮比较
JNB PSW5, ENDS ;如本轮没有进行过交换,可提前结束
DJNZ B, S1 ;下一轮,比较次数少一次
ENDS:
RET
;-----------------------------------------------------
END
任何排序算法都涉及到被排序元素间的“比较” *** 作,排序算法根据元素比较的结果执行相应的元素移动 *** 作,因此,“比较”过程与“移动”过程是相互独立的,也就是说如何比较是可任意定义的,你的这个问题可以使用任意一种排序算法进行排序,唯一要求的是你必须额外提供一个比较函数,该比较函数中执行的是绝对值比较而不是真值比较,C语言的库函数
void qsort(void base, size_t num, size_t width, int(__cdeclcompare)(const void elem1, const void elem2));就可以完成你的任务,其中的参数compare就是一个执行比较 *** 作的函数指针。
int a=0; //正在处理的数下标,分组时的循环1
int b; //正在循环的数下标,分组时的循环2
int num[50]; //输入的数
int out[10][5]; //分好的数,out[0]为一组
//排序部分:
while(a<=49)
{
for(b=0;b>=a&&b<=49;b++)
{
if(num[b]>=num[b+1])
{num[b]^=num[b+1],num[b+1]^=num[b],num[b]^=num[b+1];}; //两数互换
};
};
//分组部分:
for(a=0;a<=9;a++)
{
for(b=0;b<=4;b++)
{
out[a][b]=num[a10+b];
};
};
/输入部分和输出部分就不加入了,这个你应该会。排序部分用的是冒泡法。我手上暂时没现成的编译器,可能会有些错,不过大致应该是对的/
提供一个冒泡排序法,已通过编译,仅供参考~ #include<stdioh> #include<stringh> main() { int a[100],n,i,j,temp; printf("Input number of integers\n"); scanf("%d",&n); printf("Input integers in order\n"); for(i=0;i<n;i++) scanf("%d",&a[i]); for(i=0;i<n-1;i++) for(j=0;j<n-i-1;j++) if(a[j]>a[j+1]) { temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } for(i=n-1;i>=0;i--) { printf("%d",a[i]); printf(" "); } printf("\n"); }
以上就是关于急求:单片机实验全部的内容,包括:急求:单片机实验、C语言实验题 绝对值排序、用C语言编程,将50个实验数据从小到大排列,排完分为10组。请教大神赐教,谢谢!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)