文档库 最新最全的文档下载
当前位置:文档库 › 冒泡 插值 二分值法排序C代码

冒泡 插值 二分值法排序C代码

冒泡 插值 二分值法排序C代码
冒泡 插值 二分值法排序C代码

处理算法

1、实验目的

1.掌握随机误差的数字滤波算法。

2.掌握查表法、线性插值法。

2、实验内容

利用K分度号热电偶进行温度检测,测温范围为0-1200oC,室温25oC,现假设热电偶输出信号经信号放大100倍为0-5V信号,经单片机采集连续10次后存放在数组table[]中,其值为table[]={100,100,101,102,105,99,99,100,150,80},要求完成标度变换后转换为电压值u1,利用对半查表法查K分度表并经计算获得相应的温度值,将温度值存入变量var中。

3、主要仪器设备

1.单片机实验板一块

2.导线若干

3.PC机一台(安装有Keil c51软件)

4、实验方案

4.1实验方案

本次设计的任务是设计一个数字滤波算法,并将给定电压值进行滤波,然后再进行查表,计算出相应的温度值。

4.2硬件设计

该实验中的最小系统模块中包括CPU、复位电路和晶振,其最小系统原理图如图4.2所示。

图4.3主函数流程图

4.3.1滤波函数设计

该函数采用冒泡排序法将table数组里面的数据按从小到大的顺序进行排序,然后取中间8个数据进行求和,最后将其转换为标准电压用于后面查表。其流程图如图4.3.1所示。

图4.3.1滤波函数流程图

4.3.2查表函数设计

该函数用对半查表法进行数据查找。当要查找值不在表中,而是介于该表两个数据之间,该函数将采用插值法进行处理。其流程图如图4.3.2所示。

图4.3.2查表函数流程图

5、调试

在该次实验的调试过程中并没有遇到什么大的问题。最初在查表函数中发现min的值大于max的值。修改了中间值的计算方法后,该问题得到了解决。

6、实验结果及分析

经过调试好后,该程序能够对table数组中的数据进行数字滤波,然后进行查表,查找对应的温度值。最终结果经检验,无大偏差。

7、参考文献

[1]汪德彪.MCS-51单片机原理及接口技术[M].北京电子工业出版社.2004.

[2]张毅刚,彭喜元,董继成.单片机原理及应用[M].重庆大学出版社.2003.

附录一:硬件原理图

EA/VP 31

X119X218R ESET 9

R D 17WR 16

INT012INT113T014T115P101P112P123P134P145P156P167P178

P0039P0138P0237P0336P0435P0534P0633P0732P2021P2122P2223P2324P2425P2526P2627P27

28

PSEN

29

ALE/P 30TXD 11R XD

10U18051

Y1

11.0592MHz

C 2

30p

C 330p

R 110K

1C AP VCC

ALE P14P15P16P17WR R ST R ST VCC P10P11P12P13P33P32P30P31P00P01P02P03P04P05P06P07P20P21P22P23P24P25P26P27

附录二:源程序代码

#include"reg51.h"

#include"math.h"

unsigned int code K_TAB[121]={0,397,798,1203,16114,2022,2436,2850,3266,3681,\

4095,4508,4919,5327,5733,6137,6539,6939,7338,7737,\

8137,8537,8938,9341,9745,10151,10560,10969,11381,11793,\

12207,12623,13039,13456,13874,14292,14712,15132,15552,15974,\

16395,16818,17241,17664,18088,18513,18938,19363,19788,20214,\

20640,21066,21493,21919,22346,22772,23198,23624,24050,24476,\

24902,25327,25751,26176,26599,27022,27445,27867,28288,28709,\ 29128,29547,29965,30383,30799,31214,31629,32042,32455,32866,\

33277,33686,34095,34502,34909,35314,35718,36121,36524,36925,\

37325,38122,38519,38915,39310,39703,40096,40488,40897,41296,\

41657,42045,42432,42817,43202,43585,43968,44349,44729,45108,\

45486,45863,46238,46612,46985,47356,47726,48095,48462,48828};/*0~1200°C范围的K分度表,每隔10°C对应一个电压值*/

unsigned int table[10]={100,100,101,102,105,99,99,100,150,80};

unsigned int da=0,max=120,min=0,mid,temp,var;

int sum=0;

float u1;

void lbo(void)

{int i,j;

for(i=0;i<9;i++)

for(j=i+1;j<10;j++)

{if(table[i]>table[j])

{temp=table[i];

table[i]=table[j];

table[j]=temp;

}}

for(i=1;i<9;i++)

{sum+=table[i];}

u1=(float)sum/408;}

void ser2(void)//查表子程序

{unsigned int j;

da=(unsigned int)(u1*10000)+1000;//u1扩大10000倍

while(1)

{mid=(max+min)/2;//中心元素位

if(K_TAB[mid]==da)

{var=mid*10;

break;}//中心元素等于查表的元素,计算

if((max-min)==1)//线形插值计算

{j=(K_TAB[max]-K_TAB[min])/10;//表中相邻两值对应温度相

j=(da-K_TAB[min])/j;

var=10*min+j;

break;}

if(K_TAB[mid]>da)max=mid;

else min=mid;}}

void main()

{

lbo();

ser2();

}

C语言程序设计冒泡排序教学案例

C语言程序设计冒泡排序教学案例 永川职业教育中心杨进【案例背景】 排序是计算机学科中一项复杂而重要的技术,在各种软件中使用频率都很高,因此专家们研究了各种排序算法。在中职类设计课程教学中,常以冒泡排序来讲解排序的原理,它简单,但过程繁琐,传统教学很难激发学生兴趣,学生不易理解,也很难编写掌握冒泡排序。因此,如何合理设计教学过程,让学生掌握冒泡排序的思想和编程方法,又能发散思维,扩充知识,进而激发学生对编程课程的兴趣,是一个关键问题。 1、学情分析 学生已学习了程序设计的三种结构,学习使用了数组。但在学习排序算法的过程中学生可能会对数组变量的变化在理解上存在一定困难,在排序算法中,对双重循环内外层的作用及有关循环参数的设置可能会产生一些不合理或是错误,需要通过实践的体验进行强化使用规范。 2、教学目标 知识目标:掌握冒泡排序的原理;能结合冒泡排序的原理看懂冒泡排序的主要代码;理解冒泡排序的流程图; 能力目标:学会使用冒泡排序思想设计解决简单排序问题的算法;进一步理解程序设计的基本方法,进一步体会算法与程序实现的关系; 情感目标:培养学生分析问题、发现规律的能力,激发学生学习热情;培养良好的读程习惯; 3、教学重点、难点 重点:冒泡排序算法的基本思想,双重循环应用 难点:双重循环程序的解读,冒泡排序算法实现后对程序的理解 4、教学策略与手段 以循序渐进、层层深入为教学的指导方针,采用讲解法、演示法、讨论合作、分析归纳法引导学生参与思考,由特殊到一般,有效地突出重点突破难点,逐步深化对冒泡算法、循环思想和执行过程的理解。

5、课前准备 PPT课件、冒泡排序的视频文件。 【案例描述】 师:在前面的学习中,我们学过了用EXCEL进行一些简单的数据处理方法,请同学们说说看你是怎么对同学的成绩排次序的? 生:先选好数后,点排序就行了。 师:是的。只要用EXCEL的排序功能就可以了,点点鼠标就能完成。在前面的学习中,我们已经解开了很多单击鼠标就可以完成某一个任务的秘密,今天我们就来探访一下排序的秘密。 师:先让我们来做个舞蹈视频,同时要求同学们谈谈看后的自己的想法。并要请几位同学模拟示范。 这段真人编排的排序算法的舞蹈视频,非常生动有趣,能充分吸引学生的眼球,极大激发了学生的兴趣。 播放完毕,老师提问:请同学们说说你们看到了什么? 生:议论并说自己的想法。(冒泡排序的过程) 由于视频播放相对较快,为了让学生更好理解与参与,老师还根据具体情况请了四位涌跃分子来作下一个游戏。 请四位同学从前到后坐好并拿好老师给你们的数字,然后从后面开始两个两个比较你们手中的数,如果后面的同学数小的话就和前面的同学换一下座位,直到拿到最小数的同学坐在第一个位子为止。 现在开始,请其他同学注意观察。 请同学们说说你们看到了什么? 生:议论并说自己的想法 师:我听到了同学们的发言了,你们都看到了最小数已经在最前面了,并且是经过了3次的比较。想一想,如果要让拿第二小的数的同学坐上第二个座位,还要进行几次的比较呢?(注意只能从后开始两两比较)请拿数的同学演示一下。几次? 生:两次 师:对了,是两次,比第一次少了一次。请四位同学回到座位。刚才我们通过四位

冒泡排序的算法及其程序实现

冒泡排序的算法及其程序实现 浙江省慈溪中学施迪央 教学分析: 本节课是浙江教育出版社出版的普通高中课程标准实验教科书《算法与程序设计》第二第3节以及第五章第3节的部分教学内容。 一组不长的数据(如5个),从小到大排序,对学生来说是一件容易的事情,但他们并不知道计算机是怎么实现排序的,同时他们也没见识过计算机对大量数据(如1000个)的排序。学习排序有助于学生对计算机工作原理的认识。冒泡排序对学生来说初次接触,但前面的枚举算法和解析算法的部分内容对学习排序有一定的帮助,如数组变量的定义及使用方法、双重循环的使用方法及特点以及如何通过键盘输入一批数据(即text1_keypress()事件)在前面都已涉及,冒泡排序的学习又可以巩固前面的知识。 关于冒泡排序的算法及程序实现我安排了3个课时,本案例是在教室内完成的2节随堂课,第3课时安排学生上机实践:对键盘输入的一批数据进行冒泡排序。 教学目标: 1、知识与技能: 了解排序及冒泡排序的概念及特点 掌握冒泡排序算法的原理 初步掌握冒泡排序的程序实现 2、过程与方法: 理解冒泡排序的分析过程,并初步掌握用冒泡排序算法来设计解决简单的排序问题 3、情感态度与价值观: 通过冒泡排序算法的分析过程,培养学生思维的严谨性以及用科学方法解决问题的能力使学生深入理解计算机的工作原理,激发了学生学习程序兴趣。 教学重点: 冒泡排序算法的原理 教学难点: 分析冒泡排序的实现过程 教学策略: 讲授法与探究法。教师讲授、学生听讲,教师提问、学生动脑,层层深入,步步为营,一切水到渠成。 教学准备: 编写好手动输入一批的数据的冒泡排序的程序 编写好计算机自动生成数据的冒泡排序的程序 课堂中使用的教学课件 教学过程: 一、问题引入 问题一:什么是排序? 所谓排序,把杂乱无章的一列数据变为有序的数据,比如7,3,4,8,1这五个数据从小到大排序,结果是1,3,4,7,8,我们很容易排出来。那么电脑是怎么进行排序的呢?问题二:一批数据在VB中如何存储的?比如如何存储六位裁判为一位运动员评出的分数? 用数组变量来存储一批类型、作用相同的数据,如分别用d(1),d(2),d(3),d(4),d(5),d(6)来存储六位裁判给出的分数。 问题三:如果运动员的最后得分是从这6个分数中去掉最高分与最低分后的平均分,你认为

ARM经典汇编程序

1冒泡排序的ARM汇编程序ORG 09B0H QUE:MOV R3,#50H QUE1:MOV A,R3 MOV R0,A MOV R7,#0AH CLR 00H MOV A,@R0 Q12:INC R0 MOV R2,A CLR C MOV 22H,@R0 CJNE A,22H,Q13 SETB C Q13:MOV A,R2 JC Q11 SETB 00H XCH A,@R0 DEC R0 XCH A,@R0 INC R0 Q11:MOV A,@R0 DJNZ R7,Q12 JB 00H,QUE1 SJMP $ END

2 ARM汇编希尔排序法对10个带符号数进行排序Code: void shell(int src[],int l,int r){ int ih; r++; for(ih=1;ih<(r-l)/9;ih=ih*3+1); //eax,ih //ebx,il //ecx,ir //edx,cmps _asm{ push eax push ebx push ecx push edx push esi push edi;貌似这堆进栈用处不大哎 mov edi,src mov eax,dword ptr [ih] LIH: cmp eax,0 jna EXIH mov ebx,eax dec ebx LLH: cmp ebx,dword ptr [r] jnb EXLLH mov ecx,ebx mov edx,dword ptr [edi+ecx*4]

LCMP: mov esi,eax dec esi cmp ecx,esi jna EXCMP push ecx sub ecx,eax cmp edx,dword ptr [edi+ecx*4] pop ecx jnb EXCMP push ebx push ecx sub ecx,eax mov ebx,dword ptr [edi+ecx*4] pop ecx mov dword ptr [edi+ecx*4],ebx pop ebx sub ecx,eax jmp LCMP EXCMP: mov dword ptr [edi+ecx*4],edx inc ebx jmp LLH EXLLH: push ecx mov ecx,3 push edx cdq

选择排序和冒泡排序的C++和C

C选择排序: #include #define N 10 main() {int i,j,min,key,a[N]; //input data printf("please input ten num:\n"); for(i=0;ia[j]) {min=j;//记下最小元素的下标。 /*********交换元素*********/ key=a[i]; a[i]=a[min]; a[min]=key;} else continue; } } /*output data*/ printf("After sorted \n"); for(i=0;i #include using namespace std; #define n 4 int _tmain(int argc, _TCHAR* argv[]) { int x[n],i=0; printf("请输入%d个整数:\n",n); for(i=0;i

冒泡排序教学设计

冒泡排序教学设计 -CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN

3.2.2冒泡排序教学设计 一、教材分析 本节内容选自浙江教育出版社《算法与程序设计》第二章第三节和第五章第三节。以第二章内容为主,下节课让学生进行第五章编写程序及上机实践。 《课程标准》指出《算法与程序设计》模块教学主要目的是“使学生进一步体验算法思想,了解算法和程序设计在解决问题过程中的地位和作用;能从简单问题出发,设计解决问题的算法,并能初步使用一种程序设计语言编制程序实现算法解决问题。”冒泡排序的算法及程序实现就很好地较全面地体现了这点。 排序算法是使用频率最高的算法之一,而冒泡排序是其中一种很典型而且相对简单的方法。它的学习同时为后面的选择排序做了铺垫。通过冒泡实例的学习,可以提高学生的程序设计能力,为今后在算法与程序设计方面的进一步研究和学习打下基础。 二、学情分析 通过前面的学习,同学们已经初步了解了算法设计的基本知识,学会了利用自然语言和流程图描述解决问题的算法,对排序中碰到的循环结构的流程图和循环语句以及数组变量的使用方法都已有基础。但由于实践比较少,对以前知识的遗忘率比较高,画流程图还不太熟练,程序设计思想比较弱。因此由浅入深,逐步引导比较适合学生的口味。 三、教学目标 知识目标:掌握冒泡排序的原理;理解冒泡排序的流程图;编写冒泡排序的主要代码; 能力目标:学会使用冒泡排序思想设计解决简单排序问题的算法;进一步理解程序设计的基本方法,体会程序设计在现实中的作用; 情感目标:培养学生分析问题、发现规律的能力,激发学生学习热情;培养良好的程序书写习惯; 四、重点难点 重点:理解冒泡排序原理及它的流程图 难点:理解冒泡排序中的遍、次等概念(即对变量使用的理解) 五、课前准备 教师的教学准备:冒泡排序的课件 2

用汇编语言冒泡排序经典程序

data segment A dw 03h, 0dh, 08h, 1dh, 20h, 0fdh ;两个字节保存一个值,对应十进制的3,13,8,29,32,253 data ends code segment main proc far assume cs:code, ds:data start: push ds sub ax, ax ;ax寄存器清零 push ax mov ax, data mov ds, ax mov cx, 7 dec cx ;减1指令 loop1: ;cx=cx-1若cx!=0则继续循环 mov di, cx ;把CX寄存器的值传送到以DS寄存器(默认是DS寄存器)的内容为段值有效地址为DI 的存储单元中 mov bx, 0 loop2: mov ax, a[bx] ;把第bx个数传给ax寄存器 cmp ax, a[bx+2] ;比较第bx个数和第bx+2个数????? jle continue ;jle:小于等于则跳转,否则执行下句 xchg ax, a[bx+2] ;否则两比较数交换位置 mov a[bx], ax continue: add bx, 2 loop loop2 mov cx, di loop loop1 mov cx, 7 mov bx, 0 next: mov ax, [bx] push cx call show pop cx mov ah, 2

mov dl, ' ' int 21h add bx, 2 loop next ret main endp show: ; 显示ax里的值 mov cx, 10 cmp ax, 0 jle done div cl ;除法:被除数在DX,AX中,除数在cl中 push ax xor ah, ah ;xor实现两个操作数按位‘异或’运算,结果送至目的操作数中 call show pop dx mov dl, dh or dl, 30h ;或运算 mov ah, 2 int 21h done: ret code ends end start

基础排序总结(冒泡排序、选择排序)

1、冒泡排序 1.1、简介与原理 冒泡排序算法运行起来非常慢,但在概念上它是排序算法中最简单的,因此冒泡排序算法在刚开始研究排序技术时是一个非常好的算法。 冒泡排序原理即:从数组下标为0的位置开始,比较下标位置为0和1的数据,如果0号位置的大,则交换位置,如果1号位置大,则什么也不做,然后右移一个位置,比较1号和2号的数据,和刚才的一样,如果1号的大,则交换位置,以此类推直至最后一个位置结束,到此数组中最大的元素就被排到了最后,之后再根据之前的步骤开始排前面的数据,直至全部数据都排序完成。 1.2、代码实现 public class ArraySort { public static void main(String[] args) { int[] array = {1, 7, 3, 9, 8, 5, 4, 6}; array = sort(array); for (int i = 0; i < array.length; i++) { System.out.println(array[i]); } } public static int[] sort(int[] array) { for (int i = 1; i < array.length; i++) { for (int j = 0; j < array.length-i; j++) { if (array[j] > array[j+1]) { int temp = array[j]; array[j] = array[j+1]; array[j+1] = temp; } } } return array; } } 1.3、效率

VB NET实现选择排序与冒泡排序

Public Class Form1 Dim arr(5) As Integer Dim a(5, 5) As TextBox Private Sub delaytime() Dim i, j As Long For i = 1 To 20000 For j = 1 To 20000 i = i + 1 i = i - 1 Next j Next i End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Label1.Text = "数oy组á¨|元a素?值|ì:êo" Label2.Text = "第ì¨2一°?轮?:êo" Label3.Text = "第ì¨2二t轮?:êo" Label4.Text = "第ì¨2三¨y轮?:êo" Label5.Text = "第ì¨2四?轮?:êo" Label6.Text = "第ì¨2五?轮?:êo" Button1.Text = "产¨2生|¨2数oy组á¨|" Button2.Text = "选?择?法¤?§演Y示o?" Button3.Text = "冒??泡Y法¤?§演Y示o?" Button4.Text = "重?新?开a始o?" Button5.Text = "退a?出?" Dim i, j As Integer Dim leftlen, toplen As Integer leftlen = 120 : toplen = 32 Randomize() For i = 0 To 5 For j = 0 To 5 a(i, j) = New TextBox a(i, j).Width = 30 : a(i, j).Height = 30 a(i, j).Left = leftlen + j * 40 : a(i, j).Top = toplen + i * 32 a(i, j).Parent = Me : a(i, j).Visible = True Next j Next i End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim i, j As Integer For i = 0 To 5 arr(i) = Int(10 + 89 * Rnd()) + 1 a(0, i).Text = arr(i) Next i End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim i, j As Integer Dim min, min_i As Integer Dim t As Integer For i = 0 To 5 - 1 min = arr(i) : min_i = i For j = i + 1 To 5 If min > arr(j) Then

微机原理实验报告冒泡排序

一、实验目的 (1)学习汇编语言循环结构语句的特点,重点掌握冒泡排序的方法。 (2)理解并掌握各种指令的功能,编写完整的汇编源程序。 (3)进一步熟悉DEBUG的调试命令,运用DEBUG进行调试汇编语言程序。 二、实验内容及要求 (1)实验内容:从键盘输入五个有符号数,用冒泡排序法将其按从小到大的顺序排序。 (2)实验要求: ①编制程序,对这组数进行排序并输出原数据及排序后的数据; ②利用DEBUG调试工具,用D0命令,查瞧排序前后内存数据的变化; ③去掉最大值与最小值,求出其余值的平均值,输出最大值、最小值与平均值; ④用压栈PUSH与出栈POP指令,将平均值按位逐个输出; ⑤将平均值转化为二进制串,并将这组二进制串输出; ⑥所有数据输出前要用字符串的输出指令进行输出提示,所有数据结果能清晰显示。 三、程序流程图Array (1)主程序:MAIN

(2)

就是 NAME BUBBLE_SORT DATA SEGMENT ARRAY DW 5 DUP(?) ;输入数据的存储单元 COUNT DW 5 TWO DW 2 FLAG1 DW 0 ;判断符号标志 FLAG2 DB 0 ;判断首位就是否为零的标志FAULT DW -1 ;判断出错标志 CR DB 0DH,0AH,'$' STR1 DB 'Please input five numbers seperated with space and finished with Enter:','$' STR2 DB 'The original numbers:','$' STR3 DB 'The sorted numbers:','$' STR4 DB 'The Min:','$' STR5 DB 'The Max:','$' STR6 DB 'The Average:','$' STR7 DB 'The binary system of the average :','$' STR8 DB 'Input error!Please input again!''$' DATA ENDS CODE SEGMENT MAIN PROC FAR ASSUME CS:CODE,DS:DATA,ES:DATA START: PUSH DS AND AX,0 PUSH AX MOV AX,DATA MOV DS,AX LEA DX,STR1 MOV AH,09H ;9号DOS功能调用,提示输入数据 INT 21H CALL CRLF ;回车换行 REIN: CALL INPUT ;调用INPUT子程序,输入原始数据CMP AX,FAULT ;判断就是否出错, JE REIN ;出错则重新输入

C (++)内部排序汇总(快速排序&冒泡排序&堆排序&选择排序&插入排序&归并排序)

#include #include #include #include #define M 30001 random(int a[30001]) { int i; for(i=1;i<30001;i++) a[i]=rand()%30001; }//随机生成30000个数函数 int change1(char a[81]) { int b=0,n,i; for(i=0;a[i]!=0;i++); n=i-1; for(;i>1;i--) b+=((int)pow(10,n+1-i))*(a[i-1]-48); if(a[0]=='-') b=b*(-1); else b+=((int)pow(10,n))*(a[0]-48); return b; }//字符转化成整型 insort(int a[30001]) { int i,j,temp,temp1,n; int count=0; n=30001; for(i=1;i=0;j--)/* 每次循环完毕数组的0到i-1项为一个有序的序列*/ { count=0;/*这里count是标记位,可以减少比较次数*/ if(a[j]>temp) { temp1=a[j+1]; a[j+1]=a[j]; a[j]=temp1;

count++; }//满足条件,前移 if(count==0) break;//位置恰当,退出 } } }//insort插入排序函数 selsort(int a[30001]) { int i,j,temp; for(i=1;i<30000;i++) for(j=i+1;j<30001;j++) if(a[i]>a[j]) { temp=a[j]; a[j]=a[i]; a[i]=temp; } }//选择排序 bubsort(int a[30001]) { int i,j,temp; for(i=1;i<30001;i++) for(j=30000;j>i;j--) { if(a[j-1]>a[j]) { temp=a[j-1]; a[j-1]=a[j]; a[j]=temp; } } }//冒泡排序 int partition(int a[30001],int low,int high)

C语言冒泡排序法的简单程序

求一个C语言冒泡排序法的简单程序 悬赏分:50 - 解决时间:2007-9-4 11:16 我不明白怎么写 随便给我个就行 谢谢了 提问者:redangel0002 - 助理二级最佳答案 main() { int i,j,temp; int a[10]; for(i=0;i<10;i++) scanf ("%d,",&a[i]); for(j=0;j<=9;j++) { for (i=0;i<10-j;i++) if (a[i]>a[i+1]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp;} } for(i=1;i<11;i++) printf("%5d,",a[i] ); printf("\n"); } -------------- 冒泡算法 冒泡排序的算法分析与改进 交换排序的基本思想是:两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。 应用交换排序基本思想的主要排序方法有:冒泡排序和快速排序。 冒泡排序 1、排序方法 将被排序的记录数组R[1..n]垂直排列,每个记录R看作是重量为R.key的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡扫描到违反本原则的轻气泡,就使其向上"飘浮"。如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。 (1)初始 R[1..n]为无序区。 (2)第一趟扫描 从无序区底部向上依次比较相邻的两个气泡的重量,若发现轻者在下、重者在上,则交换二者的位置。即依次比较(R[n],R[n-1]),(R[n-1],R[n-2]),…,(R[2],R[1]);对于每对气泡(R[j+1],R[j]),若R[j+1].key

单片机实验一 冒泡法排序

实验一:冒泡法排序实验 一、实验要求 实验目的:掌握控制转移指令的功能,以及冒泡法排序的原理。 实验要求:设30H开始的10个存储单元中,存放的是无符号数,编写程序实现:10个数排序,存放在50H开始的单元中。 二、实验原理 多重循环即循环嵌套结构。多重循环程序的设计方法和单重循环是一样的,只是要分别考虑各重循环的控制条件。内循环属于外循环体重的具体处理部分。在多重嵌套中,不允许各个循环体相互交叉,也不允许从外循环跳入内循环,否则编译时会出错。应该注意每次通过外循环进入内循环式,内循环的初始条件需要重置。 三、程序设计 1、程序流程图

图 1 冒泡法程序流程图2、程序代码 N EQU 10 TAB EQU 30H ORG 0000H MOV 30H, #1 ;在30H中输入10个随机数 MOV 31H, #3 MOV 32H, #2 MOV 33H, #4 MOV 34H, #6 MOV 35H, #8 MOV 36H, #7 MOV 37H, #11 MOV 38H, #9 MOV 39H, #10

SORT: MOV R4, #N-1 LOOP1: MOV A,R4 ;冒泡法循环 MOV R3, A MOV @R0, #TAB LOOP2: MOV A, @R0 MOV B, A INC R0 MOV A, @R0 CLR C MOV R2, A SUBB A, B JNC UNEXCH MOV A, R2 UNEXCH: DJNZ R3, LOOP2 ;如果AB,则A,B调换位置 XCH A, @R0 INC R0 MOV @R0, A SWITCH: MOV R0, #30H MOV R1, #50H MOV R2, #N PAIXU: MOV A, @R0 ;将30H中排好的数移动到50H中 MOV @R1, A INC R0 INC R1 DEC R2 CJNE R2, #0, PAIXU SJMP $ END 四、程序验证 1、在30H中输入10个数,显示如下:

基于8086用汇编语言实现的十个有符号数的排序(冒泡排序算法,输入为补码,从小到大)

提示:在做实验时,我们要自己将代码区和数据区分开,因为8086上没有软件帮我们完成这个任务。 MOV R0,#218 //之所以选择208这个大点的地址,是因为避免将数据写到了代码区LOOP1:IN //将数据读入A ADD A,#128 //将补码转换为其对应的移码,因为补码本身参与加减不能比较出大 //小,而移码就是将其真值在数轴上平移了2的n次方MOV @R0,A MOV A,R0 sub a,#1 SUB A,#208 //判断有没有输入完10个数 JZ LOOP2 //输入完数据,跳转 ADD A,#208 MOV R0,A JMP LOOP1//没有输入完,就跳回接着输入 LOOP2:MOV R0,#9 //9轮循环比较就可以排完序 MOV R1,#209 MOV R2,#210 LOOP4:MOV A,@R2 SUBC A,@R1 JC LOOP3 //若210地址指向的单元中的数比209地址指向的单元中的小,则交 //换 LOOP5:MOV A,R2 ADD A,#1 SUBC A,#219 //判断此轮有没有比较完 JZ LOOP6 //若比较完,就跳到LOOP6,否则继续比较 ADD A,#219 MOV R2,A JMP LOOP4 LOOP3:MOV A,@R1 MOV 208,A MOV A,@R2 MOV @R1,A MOV A,208 MOV @R2,A JMP LOOP5 //交换完了就跳回 LOOP6: MOV A,R1 ADD A,#1 MOV R1,A ADD A,#1 MOV R2,A //让R2始终指向的是R1下一个单元 MOV A,R0 SUB A,#1 JZ LOOP7 //判断9轮比较有没有完成,若完成,跳LOOP7,否则,继续比 //较

汇编语言实现冒泡排序(一)

;用汇编语言实现实现冒泡排序,并将排序后的数输出 DATAS SEGMENT A dw 100,344,3435,43433,3438,343,134,80,8,1000,65535,54,45 N=$-A ;计算数字所占的字节数 DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS START:MOV AX,DATAS MOV DS,AX MOV SI,0 ;SI遍历数字;前一个数的地址 MOV CX,N/2-1 ;设置循环次数,M(M=N/2)个数需要,循环M-1次 CALL BUBBLE ;调用BUBBLE将原来的数排序 ;输出排序后的数 MOV CX,N/2 ;循环M次输出排序后的M个数 MOV SI,0 ;SI遍历排序后的数 MOV DI,0 ;用DI记录数字的位数 MOV BP,N+5 ;BP用于遍历存储的转化后的字符的位置 SHOW: PUSH CX ;循环次数入栈 MOV DX,0 ;由于将要进行16位除需要置高16位为0 MOV AX,[SI] ;低16位为排序后的数 CALL DTOC ;调用DTOC将十进制数转换为字符串 CALL SHOW_STR ;调用SHOW_STR将一个数转化得到的字符串输出ADD SI,2 ;下一个数 POP CX ;循环次数出栈栈 LOOP SHOW MOV AH,4CH INT 21H ;冒泡排序 BUBBLE PROC L1: PUSH CX ;将循环次数入栈 LEA SI,A ;SI遍历DATAS数据段的数字 L2: MOV AX,A[SI] ;将前一个数存于AX CMP AX,A[SI+2] ;比较前后两个数 JBE NEXT ;如果前一个数小于或等于后一个数则继续本轮的比较XCHG AX,A[SI+2] ;否则,交换前后两个数的位置 MOV A[SI],AX NEXT:ADD SI,2 ;下一个数 LOOP L2 ;注意内层循环的次数已经确定了 POP CX ;将循环次数出栈 LOOP L1 ;下一轮比较 RET BUBBLE ENDP

arm汇编之冒泡排序

arm汇编之冒泡排序 开始在ADS里面写程序后,发现自己之前对于X86汇编的学习完全归还给了我的老师门。最直接的便是要写一个从小到大的冒泡排序。冒泡排序的思想我想就不用赘述了。以前c语言遍的应该很多了。算法不成问题,可是数据结构知道是数组,可是数组在arm汇编里面该在怎么定义了? 其实,还真感觉又要从零开始了。X86的汇编已经完全归还给了我敬爱的微机原理老师。 网上看到了一个广为流传的冒泡排序,既然写不出来,那就先学习它的精髓,说不定还能为我所用了。 代码详细的看了看。具体翻译如下(arm汇编指令不太熟悉,就当时温习吧): AREA Sort,CODE,READONLY :首先用AREA伪代码加上CODE,表明下面引出的将是一个代码段(于此相对的还有数据段DATA),ENTRY 和END成对出现,说明他们之间的代码是程序的主体 ENTRY:表示代码的开始 Start MOV r4,#0 :将0赋值给r4 LDR r6,=src :在使用LDR时,当格式是LDR r0,=0x022248,则第二个参数表示地址,即0x022248,同样的,当src变量代表一个数组时,需要r0寄存器指向src则需要这样赋值:LDR r0,=src 当格式是 LDR r0,[r2],则第二个参数表示寄存器,我的理解是[]符号表示取内容,r2本身表示一个寄存器地址,取内容候将其存取r0这个寄存器中跳转 到LDR R0,[R1]将存储器地址为R1的字数据读入寄存器R0 LDR R0,[R1,#8]将存储器地址为R1+8的字数据读入寄存器R0,并将新地址R1+8写入R1,此句是将数据src的首地址赋值给R6 ADD r6,r6,#len:R6为数组的最后一个数组元素的地址。数组这时是连续分配的。 Outer LDR r1,=src:将src地址即数组元素首地址赋值给R1 Inner LDR r2,[r1] :将存储器地址为r1的字数据读入r2 LDR r3,[r1,#4]:将存储器地址为R1+4的字数据读入R3 CMP r2,r3 :比较R2,R3 STRGT r3,[r1]:若(有符号数)大于,则将R3中的字数据写入以R1为地址的存储器中

冒泡排序教学设计

高一冒泡排序教学设计 一、设计思想 算法与程序设计具有高度的抽象性和严密的逻辑性,教师难教、学生难学成为一个突出的现象。如何消除学生畏惧心理,充分调动学生的积极性,正是我设计该课的主要目标。程序设计的基本方法是自顶向下地逐步求精和模块化。自顶向下地逐步求精是指首先要对所设计的系统有一个全面的理解,其次从顶层开始连续地逐层向下分解,直到系统的所有模块都被分解为一条条的详细指令时为止。模块化是指把一个大的程序按照一定的原则划分为若干个相对独立但又相关的小程序(模块)的方法。依据这个基本方法,在教师的引导下,从简单到复杂,从粗到精,各个难点分解,最后师生共同完成总流程图的设计。在整个过程中,教师要积极引发学生的思考,让他们真正参与进来。 二、教材分析 本节内容选自浙江教育出版社《算法与程序设计》第二章第三节和第五章第三节。以第二章内容为主,下节课让学生进行第五章编写程序及上机实践。 《课程标准》指出《算法与程序设计》模块教学主要目的是“使学生进一步体验算法思想,了解算法和程序设计在解决问题过程中的地位和作用;能从简单问题出发,设计解决问题的算法,并能初步使用一种程序设计语言编制程序实现算法解决问题。”冒泡排序的算法及程序实现就很好地较全面地体现了这点。 排序算法是使用频率最高的算法之一,而冒泡排序是其中一种很典型而且相对简单的方法。它的学习同时为后面的选择排序做了铺垫。通过冒泡实例的学习,可以提高学生的程序设计能力,为今后在算法与程序设计方面的进一步研究和学习打下基础。 三、学情分析 我是先上第一、三、四章,再上第二和第五章。通过前面三章的学习,同学们已经了解了算法设计的基本知识,学会了利用自然语言和流程图描述解决问题的算法,对排序中碰到的循环结构的流程图和循环语句以及数组变量的使用方法都已有基础。但由于实践比较少,对以前知识的遗忘率比较高,画流程图还不太熟练,程序设计思想比较弱。因此由浅入深,逐步引导比较适合学生的口味。 四、教学目标 知识目标:掌握冒泡排序的原理;理解冒泡排序的流程图;编写冒泡排序的主要代码; 能力目标:学会使用冒泡排序思想设计解决简单排序问题的算法;进一步理解程序设计的基本方法,体会程序设计在现实中的作用; 情感目标:培养学生分析问题、发现规律的能力,激发学生学习热情;培养良好的程序书写习惯; 五、重点难点 重点:理解冒泡排序原理及它的流程图 难点:理解冒泡排序中的遍、次等概念(即对变量使用的理解) 六、教学策略与手段 采用讲解法、演示法、讨论合作、分析归纳法引导学生参与思考,用逐步求精的方式降低学生的理解难度,化抽象为具体,由特殊到一般,有效地突出重点突破难点。 七、课前准备

C语言冒泡排序及流程图(思路解析)

1、功能:冒泡排序 输入:数组名称(也就是数组首地址)、数组中元素个数 ================================================ */ /* ==================================================== 算法思想简单描述: 在要排序的一组数中,对当前还未排好序的范围内的全部数,自上 而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较 小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要 求相反时,就将它们互换。 下面是一种改进的冒泡算法,它记录了每一遍扫描后最后下沉数的 位置k,这样可以减少外层循环扫描的次数。 冒泡排序是稳定的。算法时间复杂度O(n2)--[n的平方] ===================================================== */ void bubble_sort(int *x, int n) { int j, k, h, t; for (h=n-1; h>0; h=k) /*循环到没有比较范围*/ { for (j=0, k=0; j *(x+j+1)) /*大的放在后面,小的放到前面*/ { t = *(x+j); *(x+j) = *(x+j+1); *(x+j+1) = t; /*完成交换*/ k = j; /*保存最后下沉的位置。这样k后面的都是排序排好了的。*/ } } } } 2 在要排序的一组数中,对当前还未排好序的范围内的全部数,自上 而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较

微机原理实验报告-冒泡排序

一、实验目的 (1)学习汇编语言循环结构语句的特点,重点掌握冒泡排序的方法。 (2)理解并掌握各种指令的功能,编写完整的汇编源程序。 (3)进一步熟悉DEBUG的调试命令,运用DEBUG进行调试汇编语言程序。 二、实验内容及要求 (1)实验内容:从键盘输入五个有符号数,用冒泡排序法将其按从小到大的顺序排序。(2)实验要求: ①编制程序,对这组数进行排序并输出原数据及排序后的数据; ②利用DEBUG调试工具,用D0命令,查看排序前后内存数据的变化; ③去掉最大值和最小值,求出其余值的平均值,输出最大值、最小值和平均值; ④用压栈PUSH和出栈POP指令,将平均值按位逐个输出; ⑤将平均值转化为二进制串,并将这组二进制串输出; ⑥所有数据输出前要用字符串的输出指令进行输出提示,所有数据结果能清晰显示。 三、程序流程图Array(1)主程序:MAIN 否

(2)冒泡排序子程序: SORT 是 否 是 否 是

四、程序清单 NAME BUBBLE_SORT DATA SEGMENT ARRAY DW 5 DUP(?) ;输入数据的存储单元 COUNT DW 5 TWO DW 2 FLAG1 DW 0 ;判断符号标志 FLAG2 DB 0 ;判断首位是否为零的标志 FAULT DW -1 ;判断出错标志 CR DB 0DH,0AH,'$' STR1 DB 'Please input five numbers seperated with space and finished with Enter:','$' STR2 DB 'The original numbers:','$' STR3 DB 'The sorted numbers:','$' STR4 DB 'The Min:','$' STR5 DB 'The Max:','$' STR6 DB 'The Average:','$' STR7 DB 'The binary system of the average :','$' STR8 DB 'Input error!Please input again!''$' DATA ENDS CODE SEGMENT MAIN PROC FAR ASSUME CS:CODE,DS:DATA,ES:DATA START: PUSH DS AND AX,0 PUSH AX MOV AX,DATA MOV DS,AX LEA DX,STR1 MOV AH,09H ;9号DOS功能调用,提示输入数据 INT 21H CALL CRLF ;回车换行 REIN: CALL INPUT ;调用INPUT子程序,输入原始数据 CMP AX,FAULT ;判断是否出错, JE REIN ;出错则重新输入 LEA DX,STR2 MOV AH,09H ;9号DOS功能调用,提示输出原始数据 INT 21H CALL OUTPUT ;调用OUTPUT子程序,输出原始数据 CALL SORT ;调用SORT子程序,进行冒泡排序 LEA DX,STR3 MOV AH,09H ;9号DOS功能调用,提示输出排序后的数据 INT 21H CALL OUTPUT ;调用OUTPUT子程序,输出排序后的数据

汇编语言程序例题

【例】试编写一程序计算以下表达式的值。 w=(v-(x*y+z-540))/x 式中x、y、z、v均为有符号字数据。 设x、y、z、v的值存放在字变量X、Y、Z、V中,结果存放在双字变量W之中,程序的流程图如图所示。 DATA SEGMENT X DW 200 Y DW 100 Z DW 3000 V DW 10000 W DW 2 DUP() DATA ENDS STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE,SS:STACK START:MOV AX,DATA MOV DS,AX ;DATA→AX MOV AX,X IMUL Y ;(X)*(Y)→DX:AX MOV CX,AX

MOV BX,DX ;(DX:AX)→(BX:CX) MOV AX,Z CWD ;(Z)符号扩展 ADD CX,AX ADC BX,DX ;(BX:CX)+(DX:AX)→(BX:CX) SUB CX,540 SBB BX,0 ;(BX:CX)-540→(BX:CX) MOV AX,V CWD ;(V)符号扩展 SUB AX,CX SBB DX,BX ;(DX:AX)-(BX:CX)→(DX:AX) IDIV X ;(DX:AX)/X MOV W,AX ;商→W MOV W+2,DX ;余数DX→W+2 MOV AH,4CH INT 21H CODE ENDS ;退出DOS 状态 END START 【例】已知某班学生的英语成绩按学号(从1开始)从小到大的顺序排列在TAB表中,要查的学生的学号放在变量NO中,查表结果放在变量ENGLISH中。编写程序如下:STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS DATA SEGMENT TAB DB 80,85,86,71,79,96 DB 83,56,32,66,78,84 NO DB 10 ENGLIST DB DATA ENDS CODE SEGMENT ASSUME DS:DATA,SS:STACK,CS:CODE BEGIN:MOV AX,DATA MOV DS ,AX LEA BX,TAB MOV AL,NO DEL AL XLAT T AB MOV ENGLISH,AL MOV AH,4CH INT 21H CODE ENDS END BEGIN

相关文档