程序如下
#include<reg51.h>
#include<stdio.h>
void main()
{
unsigned char xdata a[ ]=
{0x3f,0x44,0x32,0x54,0x66,0x56,0x99,0x88,0x77,0x11,0x34};
unsigned char i,j,t;
printf("the unsorted numbers:\n");
for(i=0;i<9;i++)
printf("%bx",a[i]);
printf("\n");
for(j=0;j<=8;j++)
for(i=0;i<=9-j;i++)
if(a[i]>a[i+1])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
printf("the sorted number:\n");
for(i=0;i<=10;i++)
printf("%bx",a[i]);
}
我对上述程序for(i=0;i<9;i++)中的循环判断条件i<9有疑问,数组给出的书明明是11个,判断条件应该是i<10才对啊?我说的正确的话,接下来的for(j=0;j<=8;j++)的判断条件应该也是错的。不知道我分析的对不对,还望各位指教!不胜感激!
程序运行的结果是
the unsorted numbers:
0x3f,0x44,0x32,0x54,0x66,0x56,0x99,0x88,0x77,0x11 ,0x34
the sorted numbers:
0x11,0x32, 0x34,0x3f,0x44,0x54,0x56,0x66,0x77,0x88,0x99
在Keil里调了下,查看XDATA确实完成11个数的排序了:
说明排序段没问题,简析如下,希望能解释明白
for(j=0;j<=8;j++) //循环10次(j=0~9),完成排序
for(i=0;i<=9-j;i++) //循环10-j次,每次取相邻两个数比较
因此,
第一步:j=0时,取10次 数对比较
第二步:j=1时,取9次 (最大的数已冒到高地址)
第三步:j=2时,取8次
…… ……
第九步:j=8时,取2次数
第十步:j=9时,最后一对数比较 【排序结束】
-------------------------------------------------------------
打印那里是肯定有问题的,用winTC调了下,结果如图,打印出来的unsorted numbers为9个
C51单片机“冒泡法”排序实例
printf("%bx",a[i]);按常理,这两段应该是对应的,判断条件下面的那个更合理,按分析前面那段只打印未排序前的a[0]~a[8];后面那段却将11个数全部打印出来了。 (实际还应以调试结果为准) 追问 程序运行的结果是the unsorted numbers:0x3f,0x44,0x32,0x54,0x66,0x56,0x99,0x88,0x77,0x11 ,0x34the...
使用单片机汇编语言冒泡法排序
一、实验要求 给出一组随机数,将此组数据排序,使之成为有序数列 二、实验目的 1.了解数据排序的简单算法。2.了解数列的有序和无序概念 三、实验说明 有序的数列更有利于查找。本程序用的是“冒泡排序”法,算法是将一个数与后面的 数相比较,如果比后面的数大,则交换,如此将所有的数比较一...
单片机冒泡法问题高分求助!
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶...
汇编语言用“冒泡法”排序
采用“冒泡法”把一个长度已知的数组元素按从大到小排序Array db 56h,23h,37h,78h,0ffh,0,12h,99h,64h,0b0hDb 78h,80h,23h,1,2,0fh,2ah,46h,32h,42h 鬼风疙瘩上 | 浏览3268 次 |举报 我有更好的答案推荐于2017-12-16 18:12:41 最佳答案 楼主写了那么多,而且格式还有差别,不知道具体是几...
如何学习C语言?
学习方法是:1、课前预习,课后复习,认真做课堂、课后的作业,理解理论知识。2、记住语法规则。3、加强逻辑思维。4、多动手,通过练习上机了解它的运行过程。5、实践—>理论—>再实践,刚开始学习C语言时,按示例练习,并推动理论的学习,然后再自己多思考,多上机实践。