注 : 此为 《C语言程序设计》P 127 - P 128 笔记
一、数组中的元素 不同排序输出 :(续)
4. 选择法 排序 :
从键盘输入10个数,用直接法升序排序。
# 分析 : 选择法排序是交换法排序的改进方法。第 3. 的程序代码中,用于排序的双重循环中,每当 a [ i ] > a [ j ]时,就交换 a [ i ]与 a[ i ],实际上不需要每次都交换,只要增设一个变量 k ,用于记录每次较小数的下标,只需在本轮比较结束后,交换 a ( i )与 a ( k )即可。
#include<stdio.h>
int main()
{
int i, j, t, a[10], k;
for (j = 0; j < 10; j ++) // 从键盘输入10个数
scanf("%d",&a[j]);
printf("\n");
for (i = 0; i < 9; i ++) // 外循环 9 次
{
k = i;
for (j = i + 1; j < 10; j ++) // 内循环
{
if ( a[k] > a[j]) // 如果前面的数比后面的大
{
k = j; // 记录较小数的下标
}
}
if (i != k) // 交换位置
{
t = a[k];
a[k] = a[i];
a[i] = t;
}
}
for (j = 0; j < 10; j ++)
printf("%-4d",a[j]); // 输出排序后的数
return 0;
}
>>> 运行结果 :
20 96 32 53 44 95 66 77 28 15
15 20 28 32 44 53 66 77 95 96
--------------------------------
Process exited after 31.15 seconds with return value 0
请按任意键继续. . .
5. 冒泡排序法 :
# 分析:冒泡排序的算法描述如下:
从键盘输入6个数据,存放到 a [0]~ a [5]的6个数组元素中。
①第1轮从 a [0]到 a [5]依次把 两个相邻的元素两两比较,即 a [0]与 a [1]比, a [1]与 a [2]比,… , a [4]与 a [5]比;
②每次相邻元素比较后,若顺序不对,则交换两个元素的值,否则不交换;
# . 假如数组 a 中 a [0]~ a [5]存放的6个数据如下:
3 7 6 5 2 4
从 a [0]到 a [5]依次两两元素比较 :
3 7 6 5 2 4 3 和 7 比 ,不交换
3 7 6 5 2 4 7 和 6 比 ,交换
3 6 7 5 2 4 7 和 5 比 ,交换
3 6 5 7 2 4 7 和 2 比 ,交换
3 6 5 2 7 4 7 和 4 比 ,交换
3 6 5 2 4 7 7 和 7 比 ,第一轮比较交换后结果
由以上示例可以看到 ,按上述算法进行第一轮比较后 ,最大数 7 已被放置到最后一个元素 a [5]中。一共6个元素,第1轮两两比较需要5次;若有 n 个元素,两两比较一轮则需进行 n - 1次;
重复上述操作,第2轮把 a [0]~ a [4]中的最大数 6 放置到 a [4]中,即倒数第二个位置,第3轮把 a [0]~ a [3]中的最大数 5 放置到 a [3]中,……,最后一轮把 a [0]~ a [1]中的最大数 3 放置到 a [1]中, a [0]中为 2 。至此 a 数组 中的数据已按 升序 排列好。
上述数组元素的排序过程中,小的数据就好像水中的气泡总是逐渐往上升,大的数据就像石块往下沉,因此称为 冒泡排序法 。
完整的过程如下 :
原始数据 3 7 6 5 2 4
第1轮比较结果 3 6 5 2 4 7
第2轮比较结果 3 5 2 4 6 7
第3轮比较结果 3 2 4 5 6 7
第4轮比较结果 2 3 4 5 6 7
第5轮比较结果 2 3 4 5 6 7
#include<stdio.h>
# define N 6
int main()
{
int i, j, t, a[N];
printf("请输入%d个整数:\n",N);
for (i = 0; i < N; i ++)
{
scanf("%d\n",&a[i]);
}
printf("\n");
for (i = 0; i < N; i ++)
{
for (j = 0; j < N - i - 1; j ++)
{
if (a[j] > a[j + 1])
{
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
printf("排序之后:\n");
for(i = 0; i < N; i ++)
{
printf("%-3d",a[i]);
}
return 0;
}
>>> 运行结果 :
请输入6个整数:
3 7 6 5 2 4
排序之后:
2 3 4 5 6 7
--------------------------------
Process exited after 25.02 seconds with return value 0
请按任意键继续. . .
6. 插入 升序 存放并输出 : ( 转看第(3)篇 )
在已有整数升序存放的数组中插入任意整数 n ,使得数组中的仍升序存放;