排序算法的设计(c语言)根据程序画流程图及对每句程序加注释

排序算法的设计(c语言)根据程序画流程图及对每句程序加注释,第1张

#include "stdioh"//标准io头文件

#include "stdlibh"//库文件

#include "timeh"//时间系头文件

#define N0 100000 //定义常量

typedef int keytype; //类型命名

typedef struct node //定义结构体

{ keytype key; //只是类型命名成keytype,其实就是int的

}Etp;//结构体类型叫做Etp

Etp R[N0+1]; // R[1]R[n] //定义数组

int n=50, count;//全局变量

void readData( Etp R[], int n)//读数据的函数

{ int i;

count=0;

srand( time( NULL ));//初始化时间种子

for( i=1; i<=n; i++) //对数组初始化

R[i]key=1000+

(int)((99990-1000)rand()/RAND_MAX); // 0RAND_MAX

}

void printData( Etp R[], int n )//打印显示数据的函数

{ int i;

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

printf("%8d%s", //格式化显示数组的数据

R[i]key, i%5==0"\n":"");

printf("\ncount=%d\n", count);

}

void bubberSort( Etp R[], int n )//冒泡排序的函数

{ int i,j;//(这个函数块就是冒泡排序的算法程序)

bool swap;

for( i=1; i<=n-1; i++)

{ swap=false;

for( j=1; j<=n-i; j++)

if( count++,R[j]key>R[j+1]key )

{ R[0]=R[j];

R[j]=R[j+1];

R[j+1]=R[0];

swap=true;

}

if( !swap ) break;

}

}

void bubberSort1( Etp R[], int n )//这个也是另一个冒泡排序的函数

{ int j;//跟上面不同的是这个算法用的是递归的方式,上面的是非递归的

for( j=1; j<=n-1; j++)

if( count++,R[j]key>R[j+1]key )

{ R[0]=R[j];

R[j]=R[j+1];//________;//就是两个变量交换值

R[j+1]=R[0];

}

if( n>1 ) bubberSort1( R, n-1); //___________;//递归调用

}

void selectSort( Etp R[], int n )//这个是选择排序

{ int i,j,k;//(这个函数块就是选择排序的算法程序)

for( i=1; i<=n-1; i++)

{

k=i;

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

if( count++,R[j]key<R[k]key ) k=j;

if( k!=i )

{ R[0]=R[i];

R[i]=R[k];

R[k]=R[0];

}

}

}

void insertSort( Etp R[], int n )//这个是插入排序

{ int i,j;

for( i=2; i<=n; i++)

{

R[0]=R[i];

j=i-1;

while( count++,R[j]key>R[0]key ) R[j+1]=R[j--];

R[j+1]=R[0];

count++;

}

}

void sift( Etp R[], int i, int m)//堆排序中的步骤

{ int k=2i;

R[0]=R[i];

while( k<=m )

{ if( count++, k+1<=m && R[k+1]key>R[k]key) k++;

if( count++,R[0]key<R[k]key ) R[i]=R[k];

else break;

i=k;

k=2i;

}

R[i]=R[0];

}

void heapSort( Etp R[], int n )//这个是堆排序

{ int j;

for( j=n/2; j>=1; j--) sift( R, j, n);

for( j=n; j>=2; j--)

{ R[0]=R[1];

R[1]=R[j];

R[j]=R[0];

sift( R, 1, j-1 );

}

}

int main()//主函数的进入口

{

readData( R, n );//读取数据

bubberSort1( R, n );//调用递归冒泡排序

printData( R, n);//显示数据

readData( R, n );//读取数据

selectSort( R, n );//调用选择排序

printData( R, n);//显示数据

readData( R, n );//读取数据

insertSort( R, n );//调用插入排序

printData( R, n);//显示数据

readData( R, n );//读取数据

heapSort( R, n );//调用堆排序

printData( R, n);//显示数据

return 0;

}

//诶·~注释完我总算看出来了,难道你要我解释各个排序的过程?

//那你还不如直接baidu或者看书,你要是不理解原理是不可能看懂过程的。

//注释也只是语句的解释,但是过程的含义是无法描述的

(1)关于fitness value,你要自己定义一个函数,如你所说从25个x变量经过一系列运算得到y值 可以其作为fitness value

(2)由于x的取值是离散的 染色体不一定要是二进制 最简单的做法是一个5进制的长为25的串。

发现的几处错误:

1、适应度函数里面if a[i]=4改为if a(i)==4,类似的还有if b[i]=4。不需要多解释了吧?一个是数组注意和C语言风格区别,另一个是判断相等的符号问题。

2、适应度函数应返回列向量,在fit函数最后加一句:fitness=fitness(:);

3、选择的结果是种群规模减小,不能使用固定的出示规模20,应把适应度函数里面两处循环for i=1:20改为for i=1:size(x,1)

4、主函数里面rein应为reins。

代码写到一个M文件中:

function zd

%% 初始化遗传算法参数

%初始化参数

NIND=20;

MAXGEN=100;

NVAR=8;

PRECI=1;

GGAP=09;% 进化代数,即迭代次数

% 种群规模

%% 初始化种群计算适应度值

% 初始化种群

FieldD=[rep(PRECI,[1,NVAR]);rep([0;1],[1,NVAR]);rep([1;0;1;1],[1,NVAR])];

Chrom=crtbp(NIND,NVARPRECI);

ObjV=fit(bs2rv(Chrom,FieldD));

gen=0;

while gen<MAXGEN

    FitnV=ranking(ObjV);

    SelCh=select('sus',Chrom,FitnV,GGAP);

    SelCh=recombin('xovsp',SelCh,07);

    SelCh=mut(SelCh,007);

    ObjVSel=fit(bs2rv(SelCh,FieldD));

    [Chrom ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel);

    gen=gen+1

    

    %找最好的染色体

    trace(gen,1)=min(ObjV);

    trace(gen,2)=sum(ObjV)/length(ObjV);

end

plot(trace(:,1)); hold on;

plot(trace(:,2)); grid;

legend('average','bestfitness');

function [fitness]=fit(x)

for i=1:size(x,1)

    i

    %随机产生一个种群

    if (x(i,6)x(i,7)-x(i,8)x(i,6))(x(i,3)x(i,2)-x(i,4)x(i,1))==0

        x(i,:)=unidrnd(2,1,8)-1;

    end%染色体的适应度

end

a=x(:,1)+x(:,2)+x(:,3)+x(:,4);

b=x(:,5)+x(:,6)+x(:,7)+x(:,8);

for i=1:size(x,1)

    i

    if a(i)==4

        c=1;

    else

        c=0;

    end

    if b(i)==4

        d=1;

    else

        d=0;

    end

    fitness(i)=c+d;

end

fitness=fitness(:);

以上就是关于排序算法的设计(c语言)根据程序画流程图及对每句程序加注释全部的内容,包括:排序算法的设计(c语言)根据程序画流程图及对每句程序加注释、遗传算法matlab程序最后目标函数值与自己的初始点所求得的值偏差太大、matlab遗传算法代码检查错误等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存