看不懂这段程序,帮忙看一下.

XR1111 2006-10-22 09:12:58
#include<iostream.h>
void InsertSort(int data[],int &n,int a)
{
int i;
for(i=0;i<n;i++)
{
if(a<=data[i]) break;
}
if(i==n) data[n]=a;
else
{
for(int j=n;j>i;j--)
data[j]=data[j-1];
data[i]=a;
}
n++;
}
void Print(int data[],int n)
{
for(int i=0;i<n;i++)
{
cout<<data[i]<<"\t";
if((i+1)%5==0)cout<<endl;
}
}
void main()
{
int data[10],nNum=0,m;
for(int i=0;i<10;i++)
{
cout<<"输入第"<<i+1<<"个整数: ";
cin>>m;
InsertSort(data,nNum,m);
}
Print(data,nNum);
}
这是个排序程序,看不懂
void InsertSort(int data[],int &n,int a)
{
int i;
for(i=0;i<n;i++)
{
if(a<=data[i]) break;
}
if(i==n) data[n]=a;
else
{
for(int j=n;j>i;j--)
data[j]=data[j-1];
data[i]=a;
}
n++;
}
这一段程序,帮忙解释详细一点.
...全文
172 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
viewpl 2006-10-22
  • 打赏
  • 举报
回复
// 对于第n个用户输入的数a(准备以从小到大的次序放入数组data中 )
void InsertSort(int data[],int &n,int a)
{
int i;
for(i=0;i<n;i++)
{
// 在数组中找到第一个大于等于a的数(注意找的个数由n决定)
if(a<=data[i]) break;
}
// 如果i==n那就是没有找到,a就是目前最大的,所以放在最末(主意n就是当前的最末)
if(i==n) data[n]=a;
else
{
// 如果找到了,那么从找到的位置开始(也就是i),依次向后移一位
for(int j=n;j>i;j--)
data[j]=data[j-1];
// 最后把腾出的位置放上a
data[i]=a;
}
n++;
}
飞哥 2006-10-22
  • 打赏
  • 举报
回复
插入排序

直接插入排序

直接插入排序是一种简单的排序方法,它的基本思想是将待排序的记录按照其值的大小插入到已排好序的有序表的适当位置,直到全部插入完为止。

例如,已知待排序的一组记录的初始排列如下所示:

R(49), R(38), R(65), R(97), R(76), R(13), R(27), … (式1)

假设在排序过程中,前四个记录已按关键字递增的次序重新排列,构成一个含4个记录的有序表

{R(38), R(49), R(65), R(97)}                (式2)

现要将式1中第5个记录(R(76))插入上述表中,以得到一个新的含5个记录的有序表,则首先要在式2的表中进行查找以确定R(76)所应插入的位置,然后进行插入。假设从R(97)起从右向左进行顺序查找,由于65<76<97,则 R(76)应插入在R(65)和R(97)之间,从后得到下列新的有序表

{R(38), R(49), R(65), R(76),R(97)} (式3)

称从式2到式3的过程为一趟直接插入排序。

通常将一个记录R[i](i=2,3,…,n)插入到当前的有序表,使得插入后仍保证该区间里的记录是按关键字有序的操作称第i-1趟直接插入排序。在排序过程的某一中间时刻,R被划分成两个子区间R[1..i-1](有序区)和R[i..n](无序区)。直接插入排序的基本操作是将当前无序区的第1个记录R[i]插人到有序区R[1..i-1]中适当的位置上,使R[1..i]变为新的有序区。为了在查找位置的过程中避免数组下标出界,在R[0]处设置监视哨。

直接插入排序与打扑克时整理手上的牌非常类似。摸来的第1张牌无须整理,此后每次从桌上的牌(无序区)中摸最上面的1张并插入左手的牌(有序区)中正确的位置上。为了找到这个正确的位置,须自左向右(或自右向左)将摸来的牌与左手中已有的牌逐一比较。一趟直接插入排序的算法如下:

procedure straipass(var R:filetype;I:integer);

{ 已知R[1..i-1]中的记录按从小到大排列,本算法插入R[i] ,使R[1..i] 中的记录仍按从小到大排列}

var j,k:integer;

begin

R[0]:=R[i]; { R[0]是监视哨,且是R[i]的副本}

j:=i-1;

while R[0] <R[j] do j:=j-1; {在有序区R[1..i-1]中进行搜索以确定R[i]的插入位置}

for k:=i-1 downto j+1 do R[k+1]:=R[k] ;

{将R[j+1]至R[i-1]的记录后移一个记录的位置,以便空出一个位置插入R[i]}

R[j+1]:=R[0] ; {将 R[i]插入}

end;{ straipass }

上述算法中的“搜索”操作采用从j=i-1起顺序进行,若R[0] >R[j] ,则搜索终止,否则令j:=j-1继续进行搜索。若在自i-1起往前搜索的过程中同时后移记录,则一趟直接插入排序可改为如下形式:

procedure straipass(var R:filetype;I:integer);{ filetype是数组类型}

var j:integer;

begin

R[0]:=R[i];

j:=i-1;

while R[0] <R[j] do

begin

R[j+1]:=R[j] ; {后移第j个记录(j=i-1,i-2,…),直至R[0] >R[j] ]}

j:=j-1;

end;{while}

R[j+1]:=R[0] {将 R[i]插入到正确的位置上}

end;{ straipass }

整个排序过程为进行n-1趟插入,即:先将序列中的第1个记录看成是一个有序的子序列,然后从第2个记录起逐个进行插入,直至整个序列变成按从小到大排列为止。下面通过一个具体实例描述直接插入排序算法的实现过程。

设n=8,有下列8个数,要求从小到大排序,每次插入时数据的变化如下:

初始 :    [7] 2 5 1 9 6 8 3

i=2: 监视哨(2) [2 7] 5 1 9 6 8 3

i=3: 监视哨(5) [2 5 7] 1 9 6 8 3

i=4: 监视哨(1) [1 2 5 7] 9 6 8 3

i=5: 监视哨(9) [1 2 5 7 9] 6 8 3

i=6: 监视哨(6) [1 2 5 6 7 9] 8 3

i=7: 监视哨(8) [1 2 5 6 7 8 9] 3

i=8: 监视哨(3) [1 2 3 5 6 7 8 9]
lin_style 2006-10-22
  • 打赏
  • 举报
回复
被楼上抢 了
Kusk 2006-10-22
  • 打赏
  • 举报
回复
插入排序。将整数a插入长度为n的从元素小到大排列的data[]数组中,插入之后顺序保持不变。

void InsertSort(int data[],int &n,int a)
{
int i;
for(i=0;i<n;i++)
{
if(a<=data[i]) break; /* i从0到n,寻找插入点,因为是从小到大排,所以一旦满足a<=data[i],
说明第i个位置就是插入点了,这时候break出来,i值就是插入点 */
}
if(i==n) data[n]=a; /* 如果插入点是在末尾,则直接赋最后一个元素值 */
else /* 否则需要移动插入点之后的元素 */
{
for(int j=n;j>i;j--) /* 这个循环是将插入点之后的每一个元素后移一个位置,以空出一个元素来放新元素*/
data[j]=data[j-1];
data[i]=a; /* 现在可以放新元素了 */
}
n++; /* 数组长度计数加1 */
}

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧