Bootstrap

一维数组程序设计示例(2)

注 : 此为 《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 ,使得数组中的仍升序存放;

;