编程对一个数组进行Shell排序的程序Word文档格式.docx
- 文档编号:15769807
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:18
- 大小:331.50KB
编程对一个数组进行Shell排序的程序Word文档格式.docx
《编程对一个数组进行Shell排序的程序Word文档格式.docx》由会员分享,可在线阅读,更多相关《编程对一个数组进行Shell排序的程序Word文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
5.源程序。
#include<
iostream.h>
voidinput(inta[],intn)
{
inti=0;
cout<
<
"
----------请输入要排序的数----------"
endl;
do
{
cin>
>
a[i];
i++;
}while(i<
n);
}//输入
voidShellSort(inta[],intn)
intd=n;
while(d>
1)
d=(d+1)/2;
//开始步长
for(inti=0;
i<
n-d;
i++)
{
if(a[i+d]<
a[i])
{
inttemp;
temp=a[i];
a[i]=a[i+d];
a[i+d]=temp;
}//互换
}
}
}//shell排序
voidoutput(inta[],intn)
for(intk=0;
k<
n;
k++)
cout<
a[k]<
'
'
;
}//输出
intmain()
intm;
---------请输入要排序多少数--------"
cin>
m;
int*a;
a=newint[m];
//申请动态数组空间
input(a,m);
ShellSort(a,m);
------------经shell排序后-------------"
output(a,m);
return0;
}
6.测试:
包括测试数据、测试结果、结果分析
测试数据:
(1)82934526
(2)355744626726726
测试结果:
结果分析:
按照人工排序可验证排序结果正确
7.心得。
1.学习了第一次接触的shell排序
2.学习了如何对程序进行模块化设计,并了解c++程序的重要性
二、第008M题
1.问题描述。
编写一个子程序NewTon(floatx0,floateps,floatx1)。
它的功能是用牛顿迭代法求
f(x)=
在x=0附近的一个实根。
牛顿迭代公式为:
迭代收敛判据为:
(eps为指定的迭代精度,例如1e-6)。
若迭代成功,则返回非零值;
否则,返回0。
2.问题分析。
对于子程序牛顿迭代,我们在主函数中用迭代的方法实现,应用循环结构,当达到所需精度时循环截止。
3.设计思路。
(1)计算f,(x)
(2)代入x0,计算x1
(3)计算f(x1)
(4)判断|f(x1)|是否小于eps
(4)如果小于eps,输出x1;
如果大于eps,令x0等于x1,重复
(2)--(4)步
4.流程图
|f(x1)|>
eps
|f(x1)|<
5.源程序。
#include<
stdio.h>
conio.h>
math.h>
floatfunction(floatx);
floatd2function(floatx);
intNewTon(floatx0,floateps,float*x1);
//函数声明
{
intn=0;
floatx0=0;
/*初值*/
floatxold,xnew;
floateps=1e-6;
/*精度*/
intNewTon(floatx0,floateps,float*x1);
xold=x0;
while(!
NewTon(xold,eps,&
xnew))
xold=xnew;
printf("
输出根为:
\n"
);
x=%f\t"
xnew);
getch();
floatfunction(floatx)
returnx*x*x-2*x*x+4*x+1;
floatd2function(floatx)
return3*x*x-4*x+4;
intNewTon(floatx0,floateps,float*x1)
*x1=x0-function(x0)/d2function(x0);
if(fabs(function(*x1))<
eps)
return1;
else
return0;
测试结果
当我们用printf("
x=%f\tf=%f\t"
xnew,function(xnew));
替换printf("
时,
输出f,若f=0.000000,则结果正确:
7.心得
1.加深对牛顿迭代的理解
2.掌握对函数声明与函数定义
3.解决难点:
如何利用循环结构进行迭代
三、第019M题
设有n个人围坐在圆桌周围,从某个位置开始用自然数进行编号为1,2,…,n。
然后从编号为k的人从1开始报数,数到m的人便出列;
下一个人(第m十1个)又从1开始报数,数到m的人便是第二个出列的人。
如此继续下去,直到最后一个人出列为止。
要求输出这个出列的顺序。
这个问题称为雅瑟夫(Josephu)问题。
具体要求如下:
(1)n、m、k由键盘输入,输入前要有提示。
(2)在输入n后,动态建立方法说明中所需要建立的数组空间;
程序运行结束时释放该
存储空间。
(3)分别用n=8,m=4,k=1以及n=10,m=12,k=4调试运行你的程序。
这是一个删除数组元素的问题,关键在于把握删除的数组下标;
可以通过循环结构顺序删除。
1)建立一个长度为n的整型数组a[],顺序存储1到n,表示n个人。
2)从第k个人开始报数。
3)用i=k-1表示数组元素下标,假设从i“指向”的数组元素开始数,数到m,相当于i值增加m-1。
如果在数的过程中遇到数组最后一个元素,则要从数组第一个元素继续数,即将数组想象成一个“环”,为此要用到求余运算,综合起来,被删除元素的下表计算公式为:
i=(i+m-1)%n如果删除的正好是数组最后一个元素,那么下一轮要从数组第一个元素开始数。
4)重复执行步骤(3),直到n等于1。
4.
流程图
否
是
stdlib.h>
inti,j,m,n,k,*pa;
inputnandm"
n>
inputk"
k;
}while(k>
n-1);
//保证k符合要求
pa=newint[n];
if(pa==NULL)
allocationfailure"
exit
(1);
for(i=0;
pa[i]=i+1;
i=k-1;
出列顺序为:
while(n>
0)
i=(i+m-1)%n;
pa[i]<
"
for(j=i+1;
j<
j++)
pa[j-1]=pa[j];
n--;
if(i==n)
i=0;
delete[]pa;
//满足题目要求二
6.测试:
n=8,m=4,k=1
n=10,m=12,k=4
1.切记动态数组空间申请后要释放
2.学习如何应用循环结构对数组元素的删除
四、第018H题
由n2个方块排成n行n列的正方形称为“n元棋盘”。
如果两个皇后位于n元棋盘上的同一行或同一列或同一对角线上,则称它们为互相攻击。
要求输出使n无棋盘上的n个皇后互不攻击的所有布局。
具体要求如下;
(1)n可由键盘输入。
程序运行结束时释放该存储空间。
(3)分别用n=4,5,6运行你的程序。
皇后不能相互攻击,也就是不能处于同一条直线上,所以每一行只能有一个皇后,也不能处于同一列或斜线上。
解决问题最直接的办法,就是在逐次在每一行每一个位置上尝试放一个皇后,并且在放后必须与前面放置的不能互相攻击。
只要能够保证n个皇后都能找到正确的位置就是成功。
(1)输入皇后的总数
(2)在第一行上一次的下一列放置皇后
(3)在第下一行寻找不与前面相互攻击的位置
(4)重复第(3)步n次
(4)如果成功,输出皇后的排列
(5)重复2~4步n次
(6)结束
iostream>
usingnamespacestd;
int*position;
//放置的位置
intqueen;
//皇后数目
intcount=0;
//第N种可能性
//判断第n行放置皇后是否合法
boolSignPoint(intn)
for(inti=0;
{
if(*(position+i)==*(position+n)||abs(*(position+i)-*(position+n))==abs(i-n))
returnfalse;
}
returntrue;
//设置皇后
voidSetQueen(intn=0)
if(queen==n)
printf("
NO.%d:
++count);
queen;
{
for(intj=0;
j++)
{
if(j==position[i])
printf("
*"
elseprintf("
0"
}
printf("
}
//return;
else
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编程 一个 数组 进行 Shell 排序 程序