递归算法实现选择排序(YOJ2.0中的题)

一遍过!

没有草稿!没有任何错误!

太爽了!

因为必须是倒序输出,所以只能用递归,比起之前做的一题,这一题要求是比较严格的

而且最后正确的数列顺序是在改变步骤之后输出,而改变步骤必须伴随着改变后的数组输出

所以你得先正确选择排序一遍,得到排序后的数组,用新数组记录下来,旧数组随着改变步骤的输出而不断变回最开始的那个数组

最后输出步骤数和新数组

代码如下:

#include<stdio.h>
void function(int location);
int num[101];
int num_last[101];
int n;
int m;//交换次数

int main(void)
{
    scanf("%d", &n);
    for(int i = 1; i <= n; i++)//从1开始记录
        scanf("%d", &num[i]);
    function(1);
    printf("Total steps:%d\n", m);
    printf("Right order:");
    for(int i = 1; i <= n; i++)
    {
        printf("%d", num_last[i]);
        if(i != n)
            putchar(' ');
    }
    
    return 0;
}
void function(int location)
{
    int min = num[location], min_loc = location;
    for(int i = location + 1; i <= n; i++)
        if(min > num[i])
        {
            min = num[i];
            min_loc = i;
        }
    if(min_loc != location)
    {
        m += 1;
        num[min_loc] = num[location];
        num[location] = min;
    }

    //递归
    if(location != n - 1)
        function(location + 1);
    else
        for(int i = 1; i <= n; i++)
            num_last[i] = num[i]; 

    //输出
    if(min_loc != location)
    {
        printf("%d<->%d:", location, min_loc);
        for(int i = 1; i <= n; i++)
            printf("%d%c", num[i], (i == n) ? '\n' :' ');
        num[location] = num[min_loc];
        num[min_loc] = min;
    }

    return;
}