C语言程序设计 一维数组的应用

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5.2 一维数组的应用
5.2.1 排序问题
数据排序是最重要的应用之一。银行用账号对所有的支票进行排序,通信公司根据姓名 排序账单等。排序的方法很多,主要有:冒泡法、选择法、快速排序法等,不同的方法效率 不同。
【例 5-4】用冒泡法对 10 个数从小到大排序。 程序设计基本思想:将相邻两个数 a[0]和 a[1]进行比较,按要求将这两个数排好序;然 后再比较 a[1]和 a[2],…,这样依此类推,两两进行比较,直到最后两个数比较并处理完 成。至此,最大的数已换到最后一个位置。这是第一趟的处理结果。每进行一趟,把剩下的 数中最大的一个移到最后位置,共进行若干趟。
a[ 0 ]
1
a[ 1 ]
5
a[ 2 ]
6
a[ 3 ]
7
a[ 4 ]
9
图 5-4 排序结果
可以推知,如果有 n 个数,要进行(n-1)趟处理,在第 i 趟中要比较(n-i)次。流程图如 图 5-5 所示。
·109·
参考程序如下:
/*程序名:5_5.c*/ /*程序功能:选择法排序*/ #include <stdio.h> #define N 20
int main()
·110·
{ int a[N],i,j,p;
printf("输入排序的数据个数:\n"); scanf("%d",&n); printf("请输入数据:\n"); for( i = 0 ; i < n ; i++)
scanf("%d",&a[i]); printf("\n 原始数据为:\n"); for( i = 0 ; i < n ; i++)
下面以 5 个数为例说明冒泡排序的过程。设有 5 个数如图 5-1 所示。
a[0]
9
7
7
7
7
a[1]
7
9
5
5
5
a[2]
5
5
9
6
6
a[3]
6
6Biblioteka Baidu
6
9
1
a[4]
1
1
1
1
9





图 5-1 冒泡法排序
第一次先将 a[0]和 a[1]比较,9 大于 7,将 a[0]和 a[1]的值对换(图 5-1(1));第二
的 9 已排在最后一个位置上,而最小的数 1 已“上浮”一个位置,共进行了 4 次比较交换。
然后对剩下的 4 个数(7,5,6,1)按同样的办法进行第二趟的比较交换,共需要进行 3
次比较交换,…,第四趟中,对剩下的两个数进行比较交换处理。5 个数排序以后的结果如
图 5-2 所示。
可以看出,对于 5 个数要进行 4 趟比较交换,第一趟中比 4 次,第二趟中比 3 次,…。
printf("%d ",a[i]);
/*输出排序前的数据*/
for( i = 1 ; i <= N-1 ; i++) /*比较的趟数*/
{
for( j = 0 ; j <= N–i–1 ; j++) /*比较一趟*/
if( a[j] > a[j+1] ) /*比较一次*/
{
temp=a[j];
/*两个数交换*/
a[0]
9
1
1
1
1
a[1]
7
7
5
5
5
a[2]
5
5
7
6
6
a[3]
6
6
6
7
7
a[4]
1
9
9
9
9





图 5-3 选择法排序
可以看出,对于 5 个数要进行四趟比较,第一趟比较 4 次,第二趟比较 3 次,… 第 一趟先将 9 和剩下的 4 个数中最小的数 1 进行交换。如图 5 -3⑵所示。共进行 4 次比较。这 时 5 个数中最小的数已调到 a[0]位置上了。第二趟将 7 和剩下的 3 个数中最小的数 5 进行交 换,如图 5 -3 ⑶所示,共进行三次比较,这时,5 个数中第二小的那个数已调到 a[1]位置 上了。…第四趟中,对剩下的两个数进行比较交换处理。5 个数排序以后的结果如图 5-4 所 示。
int a[N] , i , j , temp;
printf("请输入 10 个数:\n");
for( i = 0 ; i < N ; i++)
scanf("%d",&a[i]); /* 输入数据 */
printf("\n");
printf("原始数据为:\n");
for( i = 0 ; i < N ; i++)
次将 a[1]和 a[2]比较,9 大于 5,将 a[1]和 a[2]的值互换(图 5-1(2));第三次将 a[2]和
a[3]比较,9 大于 6,将 a[2]和 a[3]的值交换(图 5-1(3));第四次将 a[3]和 a[4] 比较,
9 大于 1,将 a[3]和 a[4]的值交换(图 5-1(4))。很明显,经过第一趟处理,5 个数中最大
可以推知,如果有 n 个数,要进行(n-1)趟比较交换处理,在第 i 趟要比较(n-i)次。用
外循环表示第 i 趟比较,用内循环表示第 i 趟中第 j 次比较,因此应该使用双重循环。
a[ 0 ]
1
a[ 1 ]
5
a[ 2 ]
6
a[ 3 ]
7
a[ 4 ]
9
图 5-2 排序结果
·107·
参考程序如下:
/*程序名:5_4.c*/ /*程序功能:冒泡法排序*/ #include <stdio.h> #define N 10 void main() {
a[j]=a[j+1];
a[j+1]=temp;
}
}
printf("\n 排序后的数据为:\n");
for(i=0; i<N; i++)
printf("%d ",a[i]); /*输出排序后的数据*/
printf("\n");
return 0; }
程序运行结果:
请输入 10 个数: 2574398061 原始数据为: 2574398061 排序后的数据: 0123456789
·108·
2.选择法排序
【例 5-5】 对 n 个数从小到大排序 程序设计基本思想:将第 1 个元素 a[0]与第 2 个元素(即 a[1])到第 n 个元素(a[n-1]) 中最小者 a[p]交换(假如 a[p]<a[0]的话),这时 n 个数中最小的数巳调到最前面的 a[0] 位置,这是第一趟的处理结果。第二趟要处理的是剩下的(n-1)个元素的排序。同理,将 a[1] 与 a[2]到 a[n-1]中最小者交换(假如该数小于 a[1]的话)。这时 a[1]中存放的已是第二小的 数。…这样依次类推,进行若干趟处理后,将 n 个数按从小到大的顺序排好。 下面以 5 个数为例作具体说明,设有 5 个数如图 5-3 所示。
printf("%d ",a[i]); printf("\n");
相关文档
最新文档