// fdscpp : 定义控制台应用程序的入口点。
//
#include "stdafxh"
void main()
{
int a[5],b,c;
printf("请输入您要比较的5个数:\n");
for(int i=0;i<5;i++)
{
scanf("%d",&a[i]);
}
for(c=0;c<5-1;c++)
{
for(b=0;b<5-c-1;b++)
{
if(a[b]<a[b+1])
{
int t;
t=a[b];
a[b]=a[b+1];
a[b+1]=t;
}
}
}
for(int k=0;k<5;k++)
{
printf("%d ",a[k]);
}
printf("\n\n");
}
比较简单的用冒泡法实现的5个数比大小最后从大到小排列输出
你不必修改排序过程,排序过程是绝对的正确和标准,问题在于参数的传递上。
因为主程序中c[1]=48但子程序中x[0]=48。
子程序被调用时必须为他的每个形参提供一个实参,按参数的位置顺序一一对应。
主程序中数组定义为ar
c:array[123425]
of
integer;但在"paixu"过程的形参表中“procedure
paixu(var
x:array
of
integer;n:integer);”,也就是说你没有定义x数组的范围,只是定义了x数组的数据类型,因此系统编译时默认数组从0开始,也就是在编译时,x的定义是x:array
[023425-1]
of
integer;结果因为冒泡排序只处理n-1编,排好了数组中1到n-1的顺序,正常情况下第n个数肯定是最小的那个,就造成了你第一个数据没有排序的假象。
如果你一定要用数组做参数,你可以先用type来定义一个数据类型,这样再写过程时候既简单也方便,你那样写的过程参数表(尤其是x:array
of
integer)是极爱岀些特别诡异的问题的。
这是我修改后的源程序:
program
zheng;
type
arr=array
[123425]
of
integer;
var
c:arr;
y,r:integer;
procedure
paixu(var
x:arr;n:integer);
var
a,b,k:integer;
begin
for
a:=1
to
n-1
do
for
b:=1
to
n-a
do
if
x[b]<x[b+1]
then
begin
k:=x[b];
x[b]:=x[b+1];
x[b+1]:=k;
end;
end;
begin
readln(r);
for
y:=1
to
r
do
read(c[y]);
readln;
paixu(c,r);
for
y:=1
to
r
do
write(c[y],'
');
readln;
end
字字皆辛苦呀
冒泡排序(递增)是把小的数据向上推移的一种排序技术。具体的推导过程见ppt课件,教师根据课件的演示进行讲解。为了帮助学生理解,有时间可以让若干个学生演示排序的过程,还可以观看教材配套的“冒泡排序swf”动画,以加深理解。算法分析后,在学生理解冒泡排序程序的基础上,完成VB程序的设计,界面如下:
控件信息如下:
控件
属性
属性值
说明
Form1
Caption
冒泡排序算法分析及实现
显示程序的功能
Command1
Caption
<<<自动生成数据
说明命令按钮的作用
Command2
Caption
开始冒泡排序>>>
说明命令按钮的作用
Text1
text
空串
输入要生成多少个数据
Lable1
Caption
待排序:
说明文本框list1的作用
Lable2
Caption
已排序:
说明文本框List2的作用
Lable3
Caption
排序数据量:
说明文本框text1的作用
List1
使用缺省值
显示自动生成的待排序数据
List2
使用缺省值
显示排好序以后的数据
Command1的作用是click后生成系列整数,具体个数由text1文本框里输入的数据决定。要用到Rnd()生成(0,1)的一个随机数,round()四舍五入两个函数。具体代码见源程序。学生完成程序制作后,若有时间可进行知识拓展,如介绍算法时是使数据递增,能否修改程序使之完成递减排序的功能。增加一个label4标签,显示冒泡排序消耗的时间。以便下一课与选择排序的效率进行比较。生成可执行文件
我来```=着```来了``这个够多了吧`不够再说``
根据这个排序代码:
/1 源程序/--------------------------冒泡排序法
#include <graphicsh> /包含进graphics头文件/
# include <dosh> /包含进dos头文件/
#define N 8 /定义排序数据为8个/
void Init(int a[]);/声明函数init/
void Close(void);/声明函数`图形模式结束函数/
void Pr(int a[],int n);/声明函数``输出数组函数/
void DrawChange(int i,int j);/声明函数~~画交换箭头函数/
void Bubble_sort(int a[],int n);/声明函数``~冒泡排序函数`/
void main(void)
{
int i,a[N]; /定义变量a[8]和循环控制变量i/
printf("Please enter 8 int number\n"); /输出"Please enter 8 int number\n/
for(i=0;i<N;i++) /循环输入数字到数组a 中/
scanf("%d",&a[i]);
Init(a);/调用函数init初始化状态/
Bubble_sort(a,8);/调用排序函数进行排序/
Close();/调用close图形模式结束/
exit(0); /退出/
}
void Init(int a[])/初始状态/
{
int gd=DETECT,gm,i;
initgraph(&gd,&gm,"");/初始化图形系统/
cleardevice(); /清屏/
setcolor(YELLOW); /设置颜色/
outtextxy(210,10,"any key to continue"); /在210,10点输出any key to continue/
Pr(a,40);/第一次输出数组/
getch(); /等待压任意键/
}
void Close (void) /图形模式结束/
{
getch(); /等待压任意键/
closegraph(); /关闭图形模式/
}
void Pr(int a[],int n)/输出数组/
{
int i;
char num[5];
settextstyle(0,0,2); /设置输出样式/
setcolor(GREEN); /设置输出颜色为green/
for(i=100;i<500;i+=50)/i控制显示位置和计算数组下标/
{
sprintf(num,"%d",a[(i-100)/50]); /将数值转化为字符串/
outtextxy(i,n,num); /输出字符串/
}
}
void DrawChange(int i,int j)/画交换箭头,画五根线组成一双向箭头线/
{
setcolor(6); /设置输出颜色/
line(j50+120,i+8,j50+140,i+8); /按给出的坐标位置画直线/
line(j50+120,i+8,j50+120+5,i+4);
line(j50+120,i+8,j50+120+5,i+12);
line(j50+140,i+8,j50+140-5,i+4);
line(j50+140,i+8,j50+140-5,i+12);
}
void Bubble_sort(int a[],int n)/冒泡排序/
{
int i,j,t,flag;
char num1[5],num2[5];
for(i=0;i<n-1;i++)/冒泡排序/
{
flag=0; /设置数据交换标志/
for(j=0;j<n-1-i;j++)
{
Pr(a,i40+80);/输出数/
setcolor(BLUE);/输出要比较的两个数/
sprintf(num1,"%d",a[j]);/将两个数字转成字符串输出/
outtextxy(100+j50,i40+80,num1);
sprintf(num2,"%d",a[j+1]);
outtextxy(100+(j+1)50,i40+80,num2);
sleep(1);/暂停运行一秒/
/setfillstyle(SOLID_FILL,BLACK);
bar(0,i40+60,640,i40+100);/ /只显示当前两个要交换的数据/
if(a[j]>a[j+1])/如果前面的大于后面的/
{
flag=1; /置交换标志/
DrawChange(i40+80,j);/画交换箭头/
setcolor(RED);
outtextxy(100+j50,i40+80,num1);
outtextxy(100+(j+1)50,i40+80,num2);
t=a[j];/交换/
a[j]=a[j+1];
a[j+1]=t;
sleep(1); /程序间隔1秒/
setfillstyle(SOLID_FILL,BLACK);/黑巨型的方式把这行给删除/
bar(0,i40+60,640,i40+100);
}
}
Pr(a,i40+80); /输出数/
sleep(1); /程序间隔1秒/
if(flag==0)break; /如果本次比较没有发生交换则跳出循环/
}
}
功能说明:
通过图形的方式展现冒泡排序``从小往大排```每轮排序后换行`且显示出排序过程`
程序的具体功能设计 :
void Pr(int a[],int n);
void DrawChange(int i,int j);
void Bubble_sort(int a[],int n);
程序的功能主要由着3方面来完成```
首先是`void Pr(int a[],int n);``输出函数``
for(i=100;i<500;i+=50)/i控制显示位置和计算数组下标/
{
sprintf(num,"%d",a[(i-100)/50]); /将数值转化为字符串/
outtextxy(i,n,num); /输出字符串/
}
通过这个循环来实现``图形模式下输出数组``
其次是
DrawChange(int i,int j)``通过画箭头的方式来显示交换过程`
如1 2 1←→2 2 1
{
setcolor(6); /设置输出颜色/
line(j50+120,i+8,j50+140,i+8); /按给出的坐标位置画直线/
line(j50+120,i+8,j50+120+5,i+4);
line(j50+120,i+8,j50+120+5,i+12);
line(j50+140,i+8,j50+140-5,i+4);
line(j50+140,i+8,j50+140-5,i+12);
}
最后是Bubble_sort``
基于普通的冒泡排序的方法```双层循环控制``
for(i=0;i<n-1;i++)/冒泡排序/
{
flag=0; /设置数据交换标志/
for(j=0;j<n-1-i;j++) ```
在把Pr(int a[],int n);
DrawChange(int i,int j);融合进去后就基本完成设计了```
===========================================================================
程序的结构 程序基于1个main函数和``5个自定义函数构成以及系统自带的一些函数
void Init
void Close
void Pr
void DrawChange
void Bubble_sort```
其中main()函数调用了`Init Close Pr DrawChange Bubble_sort```
Pr调用了sprintf outtextxy这2个系统自带的输出函数
DrawChange 调用了line画线着个系统自带的输出函数
Bubble_sort 比较复杂 调用了`` 自定义函数Pr DrawChange``以及sprintf
outtextxy
sleep
bar等一系列系统函数
通过函数实现了个模块的独立性`
是程序结构也十分清晰
#include "stdioh"
int main( )
{ int a[128], i, j, n=6,temp;
printf("请输入6个整数:\n");
for(i=0; i<n; i++)
scanf("%d",&a[i]);
for(i=0; i<n-1; i++)
for(j=0; j<n-1-i; j++)
if (a[j]>a[j+1])
{ temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
printf("升序排序后的数组是:\n");
for(i=0; i<n; i++)
printf("%d ",a[i]);
}
DSEG SEGMENT
n equ 10
BUFFER DB 9,11,2,7,21,13,2,0,14,3
DSEG ENDS
CSEG SEGMENT
assume cs:CSEG, ds:DSEG
MAIN PROC FAR ;主程序入口
mov ax, dseg
mov ds, ax
mov cx,n
dec cx
loop1: mov di,cx
mov bx,0
loop2: mov al,buffer[bx]
cmp al,buffer[bx+1]
jge continue
xchg al,buffer[bx+1]
mov buffer[bx],al
continue: add bx,1
loop loop2
mov cx,di
loop loop1
mov ah,1;按任意键退出
int 21h
mov ax, 4c00h ;程序结束,返回到 *** 作系统系统
int 21h
MAIN ENDP
CSEG ENDS
END MAIN
冒泡排序是比较经典的排序算法。代码如下:
for(int i=1;i<arrlength;i++){
for(int j=1;j<arrlength-i;j++){
//交换位置
}
:
原理:比较两个相邻的元素,将值大的元素交换至右端。
思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复第一趟步骤,直至全部排序完成。
第一趟比较完成后,最后一个数一定是数组中最大的一个数,所以第二趟比较的时候最后一个数不参与比较;
第二趟比较完成后,倒数第二个数也一定是数组中第二大的数,所以第三趟比较的时候最后两个数不参与比较;
依次类推,每一趟比较次数-1;
……
举例说明:要排序数组:int[] arr={6,3,8,2,9,1};
for(int i=1;i<arrlength;i++){
for(int j=1;j<arrlength-i;j++){
//交换位置
}
参考资料:
以上就是关于求visual c++冒泡排序的程序源代码!全部的内容,包括:求visual c++冒泡排序的程序源代码!、pascal自定义过程冒泡排序、c++语言中的冒泡排序如何显示排序过程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)