求visual c++冒泡排序的程序源代码!

求visual c++冒泡排序的程序源代码!,第1张

// 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++语言中的冒泡排序如何显示排序过程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10143731.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存