选择排序法

老师布置的程序实验作业:

下面程序为选择排序,要求按如下步骤完成本题实验,理解和掌握函数参数的传递,理解函数的嵌套调用。

1) 阅读程序,理解选择排序的思想

2) 上机编辑,调试程序

3) 用两组数据,给出程序运行结果,

4) 用单步执行,观察程序执行的流程

5) 画出流程图描述程序的实现

     6) 问题:什么是函数的嵌套调用?

 

原理:
选择排序,即从乱序输入的一组数组(个数为n)中,找出其中大(最小)元素所在的位置,把该元素的和最右边(最左边)的元素交换位置。接下来,排除已排序元素,在剩下元素中寻找最大(最小元素)。。。重复操作,直到操作了n-1遍后,所有元素都已经排好序,再输出排序后的数组。

代码:

#include <iostream>
using namespace std;
#define N 10
int max(int a[], int n);
void sel_sort(int a[], int n);
int main()
{
    loop:             //使用loop控制流程,方便调试
    int a[N];
    for (int i = 0; i < N; i++)   //一次输入数组的值
    {
        cin >> a[i];
    }
    //调用函数sel_sort,函数sel_sort中嵌套调用函数max
    sel_sort(a, N);      //a相当与指针,实际上传递了数组a[10]的首地址也即是a[0]的地址
    for (int i = 0; i < 10; i++)
    {
        cout << a[i] << " ";
    }
    cout << endl;
    goto loop;
    
    system("pause");
}
int  max(int a[], int n)
{
    int i, j = 0;
    for (i = 1; i < n; i++)
    {
        if (a[i] > a[j])
        {
            j = i;
        }
    }
    return j;                      //把j返回给sel_sort函数中max函数的调用点
}
void sel_sort(int a[], int n)
{
    int j;                   //在函数sel_sort中可见
    int i = n;
    for (; i > 1; i--)
    {
        j=max(a, i);               //调用max函数,把数组和变量i传输过去,i用来控制max中选择最大值的范围,每选完一个最大值,缩小一次范围,直到缩小为2
        int temp = a[i-1];          //交换当前未排序的最右边的值与经max函数求出的当前范围中的最大值
        a[i-1] = a[j];           
        a[j] = temp;

    }
    //经过9次选择排序后,得出从左往右是从小到大排序的数列
    return;     //函数返回类型为void,此行可省略
}

 调试结果:

错漏百出非常拙劣的程序框图:

函数嵌套调用:

函数的定义是相互平行的,不可在一个函数定义中定义另一个函数,但函数可以在另一个函数中被调用。函数的嵌套调用就是,在一个函数中,调用其他的函数,通过其他函数的行为或者是调用其他函数的返回值来达到某种目的。

 

原文地址:https://www.cnblogs.com/urahyou/p/10010340.html