C++一维数组的排序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第三节数值型一维数组的应用

一、数值型一维数组在递推中的应用

【例5-3】斐波拉契数列:前两项为0和1,从第三项开始,各项均为前相邻两项之和:0,1,1,2,3,5,8,11,19,……。写C程序,输出该数列前N项。

【简要分析】显然这是一个典型的递推问题,结合数组,从第三个数开始,其递推公式是:

x[i]=x[i-1]+x[i-2],其中i=2,3, …,N-1。

利用循环结构,用N-S流程图描述的程序逻辑如图5-2所示。

参考源代码:

/* 例5-3,5-3.cpp */

#include

#define N 20

void main()

{

long i, x[N];

x[0] = x[1] = 0; /* 赋初值*/

for ( i = 2; i < N; i++ ) /* 尚剩18项*/

x[i] = x[i - 1] + x[i - 2]; /* 产生各项*/

for ( i = 0; i < N; i++ ) /* 输出数列*/

cout<< "\t" << x[i];

system(“pause”);

}

【思考验证】如果将x数组定义为整型int,程序是否能正常运行?

【模仿训练】某数列前三项为0、1、1,以后各项均为前相邻三项之和,输出该数列前N项。

二、排序

【例5-4】键盘输入N个战士的身高,将其升序排列。

【简要分析】排序是数组的经典应用,现实生活中用得太多,请读者务必掌握。排序的方法很多,《数据结构》中有详细介绍,请读者自己查阅,本例用比较法。

具体实现逻辑是:将数组元素a[i](i=0,1,2…,N-2)与它后边的每一个元素a[j](j=i+1,…,N-1)逐个比较,凡有a[j]

参考源代码:

/* 例5-4,5-4_1.cpp */

#include

#define N 10

void main()

{

int a[N], t, i, j;

for ( i = 0; i < N; i++ ) /* 本循环输入N个原始数据*/

cin>> a[i];

for ( i = 0; i < N -1; i++ ) /* 本循环完成排序*/

for ( j = i + 1; j < N; j++ ) /* x[i]与它后边所有元素逐一比较,大则交换*/ if ( a[j] < a[i] )

{ temp = a[j]; a[j] = a[i]; a[i] = temp; }

for ( i = 0; i < N; i++ ) /* 输出排序后的数组*/

cout<< a[i];

system(“pause”);

}

【思考验证】怎样修改本程序以实现降序排列?

还有一种排序方法称为冒泡法。这种方法可形象描述为:使较小的值象水中的空气泡一样逐渐“上浮”到数组的顶部,而较大的值则逐渐“下沉”到数组的底部。这种技术要排序好几轮,每轮都要比较连续的数组元素对。如果某一对元素的值本身是升序排的,那就保持原样,否则交换其值。排序过程的N-S流程如图5-4所示。

参考源代码:

/* 例5-4,5-4_2.cpp */ #include

#define N 10

void main()

{

int a[N], t, i, j;

for ( i = 0; i < N; i++ ) /* 输入N个原始数据*/

cin>> a[i];

for ( i = 0; i < N -1; i++ ) /* 本循环完成排序*/

for ( j = 0; j < N - i; j++ ) /* x[i]与它后边所有元素逐一比较,大则交换*/

if ( a[j] > a[j + 1] )

{ temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; }

for ( i = 0; i < N; i++ ) /* 输出排序后的数组*/

cout<< " \t" << a[i];

system(“pause”);

}

三、定位与插入

【例5-5】输入一个数,插入到某升序一维数组中,使插入后的数组仍然升序。

如设原数组x[6]:-123,-2,2,15,23,45。

假设待插入的新数为 7 ,则该数应插入到数2与15之间,数组长度增加1。

插入后的数列为x[7]:-123,-2,2,7,15,23,45。

【简要分析】先将a置于数组最后,然后将a与它前边的元素逐一比较,如果a小于某元素x[i],则后移x[i]一个位置,否则将a置于x[i+1]的位置,结束。

x[0] x[1] x[2] x[3] x[4] x[5] x[6]

-123, -2, 2, 15, 23, 45, 7 /* 设x[6]=7 */

-123, -2, 2, 15, 23, 45, 45 /* x[5]后移一个位置 */

-123, -2, 2, 15, 23, 23, 45 /* x[4]后移一个位置 */

-123, -2, 2, 15, 15, 23, 45 /* x[3]后移一个位置 */

相关文档
最新文档