1实验目的:熟练掌握一维数组,二维数组的定义,初始化和输入输出方法;熟练掌握与数组有关的常用算法(如查找,排序等)。
2实验内容:设定一个整形数组存放20个元素,用直接赋值的方法在程序中初始化该数组。先对这些无序的数据进行排序,然后采用折半查找,把要寻找的数的位置输出出来。
3算法描述流程图
源程序:#include<stdioh>
void main()
{int k,s,b,i,j,m,n,a[20]={12,9,16,21,6,11,19,4,8,20,15,2,5,18,14,7,3,10,13,17};
for(s=0;s<20;s++)
{
for(i=s+1;i<20;i++)
{
if(a[s]>a[i])
{
j=a[s];
a[s]=a[i];
a[i]=j;
}
}
}
scanf("%d",&b);
m=0;
n=19;
while(m<=n)
{
k=(m+n)/2;
if(b==a[k])
{
printf("FOUND\n");
printf("%d\n",k+1);
break;
}
else
{
if(b<a[k])
n=k-1;
else
m=k+1;
}
if(m>n)
printf("NO FOUND");
}
}
5测试数据:3,5, 20,30
6运行结果:FOUND 2;FOUND 4;FOUND 19 ;NO FOUND
7出现问题及解决方法:编译时出错,修改源程序,直到没有错误为止
8实验心得:通过折半查找,可以实现对数组数据的处理,并且增加了查找速度
冒泡法对10个数由小到大排序:
a=rand(1,10);%随机生成一组数
a%未排序前原始数据
n=10;%数组长度
forj=1:n-1
fori=1:n-1
ifa(i)>a(i+1)
c=a(i);
a(i)=a(i+1);
a(i+1)=c;
end
end
end
a%排序后数组显示
资料拓展
冒泡法排序原理:例如有一组数为12,23,1,4,2,6。使用冒泡排序方法使这组数从小到大排列。首先12和23比较,12<23,则位置不变;接着23和1比较,因为23>1,所以交换23和1的位置,这组数这时是12
123426;
然后比较23和4,因为23>4,所以交换23和4,这组数变为1214232
6;然后比较23和2,23>2,再交换,变为12142236;然后比较23和6,23>6,再交换,最后为121426
23。
这就叫经过了一趟排序,即相邻两数比较,大的放在后面,经过一趟排序后,最大的数就冒泡到最后面了。然后再对前n-1个数进行第二趟排序,排序后第二大的数就放在了第n-1个位置;最后经过n-1趟排序后整个数组就有序了。
MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。
MATLAB是matrix&laboratory两个词的组合,意为矩阵工厂(矩阵实验室)。是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。
它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,代表了当今国际科学计算软件的先进水平。
参考资料来自于:MATLAB-百度百科
文件的顺序存储结构表示
#define n l00 //假设的文件长度,即待排序的记录数目
typedef int KeyType; //假设的关键字类型
typedef struct{ //记录类型
KeyType key; //关键字项
InfoType otherinfo;//其它数据项,类型InfoType依赖于具体应用而定义
}RecType;
typedef RecType SeqList[n+1];//SeqList为顺序表类型,表中第0个单元一般用作哨兵
冒泡
void BubbleSort(SeqList R)
{ //R(ln)是待排序的文件,采用自下向上扫描,对R做冒泡排序
int i,j;
Boolean exchange; //交换标志
for(i=1;i<n;i++){ //最多做n-1趟排序
exchange=FALSE; //本趟排序开始前,交换标志应为假
for(j=n-1;j>=i;j--) //对当前无序区R[in]自下向上扫描
if(R[j+1]key<R[j]key){//交换记录
R[0]=R[j+1]; //R[0]不是哨兵,仅做暂存单元
R[j+1]=R[j];
R[j]=R[0];
exchange=TRUE; //发生了交换,故将交换标志置为真
}
if(!exchange) //本趟排序未发生交换,提前终止算法
return;
} //endfor(外循环)
} //BubbleSort
快速选择
void SelectSort(SeqList R)
{
int i,j,k;
for(i=1;i<n;i++){//做第i趟排序(1≤i≤n-1)
k=i;
for(j=i+1;j<=n;j++) //在当前无序区R[in]中选key最小的记录R[k]
if(R[j]key<R[k]key)
k=j; //k记下目前找到的最小关键字所在的位置
if(k!=i){ //交换R[i]和R[k]
R[0]=R[i];R[i]=R[k];R[k]=R[0]; //R[0]作暂存单元
} //endif
} //endfor
} //SeleetSort
在同一行中进行排序我目前还未掌握(vbs除外),现在我们来说一下针对于列的来解决你的问题。
1 你可先将行的内容复制为列(在选择性粘贴里面有个“转置”,可将行变为列,亦可把列变为行)。
2 在刚才复制出来的旁边一列输入公式来判断此数据重复了几次(例:设内容从A2单元格开始,A1做为标题,那公式就从B2开始,输入“=COUNTIF(A:A,A2)”,引号不要,将此公式复制到下去,即可知道某数据重复了几次。)
3 将内容及重复次数选中后,点“数据”——“排序”,列B选为降序,列A选降序升序均可,点“确定”。
4 用转置的方法将内容再复制回原来的地方即可。
下图程序,就可以实现。
反相显示的,就是排序部分。
本程序已经经过实验。
以上就是关于c语言先排序后折半查找程序的实验报告全部的内容,包括:c语言先排序后折半查找程序的实验报告、用matlab 程序 冒泡法对10个数由小到大排序、编写一个函数,实现将一组数据进行排序 并在程序中调用该函数,并将排序结果输出等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)