【C++练习系列】选择排序的递归算法(c++)(有例题和详尽解析)

1. 快捷版

例题:编写一个用递归来实现选择法排序,并使用函数作为模板。
解决问题的代码:

#include <iostream>
using namespace std;
void sort(int x[], int n, int index)
{
    if (index >= n - 1)
        return;
    else
    {
        int min = x[index], ii = index;
        for (int j = index + 1; j < n; j++)
            if (x[j] < min)
            {
                min = x[j];
                ii = j;
            }
        if (ii != index)
        {
            int t = x[index];
            x[index] = x[ii];
            x[ii] = t;
        }
    }
    sort(x, 10, index + 1);
}
int main()
{
    //int a[] = {3, 2, 6, 8, 1, 9, 7, 4, 10, 5};

    int a[10];
    int i, j;

    for (j = 0; j < 10; j++)
    {
        cin >> a[j];
    }

    /*for (i = 0; i < 10; i++)
        cout << a[i] << " ";
    cout << endl;     */

    sort(a, 10, 0);

    for (i = 0; i < 10; i++)
        cout << a[i] << " ";
    cout << endl;
    return 0;
}

2.详细版

(1)什么是选择排序

文字解释

对n个数按从小到大进行排序,一共用n-1次就可以完成任务。
第一次:找出n个数中最小的数,和第一个数进行交换;
第二次:找出n-1个数(排除第一次找到的数)中最小的数,和第二个数进行交换;
第三次:找出n-2个数中的最小的数,和第三个数进行交换

第n-1次:找出2个数中的最小的数,和第n-1个数进行交换,最后一个数不用排。

代码解释

例题:对输入的十位数进行选择排序。

#include <iostream>
using namespace std;
int main()
{
    int i, j, arr[10], t, k;
    cout << "输入需要排序的十个数:" << endl;
    for (i = 0; i < 10; i++)
        cin >> arr[i];
    //上面不重要

    //这是十个数的选择排序的重点
    for (i = 0; i < 9; i++)          //这代表要执行9次。从0开始,到8结束。
    {
        k = i;                       //用k代表一维数组下标
        for (j = i + 1; j < 10; j++) 
            if (arr[j] < arr[k])     //比大小
                k = j;               //换下标
        if (k != i)                  //如果k=i,表示那个值本身就是最小值。
        {                            //如果k=j不等于i,表示下标k的值为最小值
            t = arr[i];
            arr[i] = arr[k];         //交换最小值
            arr[k] = t;
        }
    }


    //下面不重要
    cout << "排序输出结果位:" << endl;
    for (i = 0; i < 10; i++)
        cout << arr[i] << " ";
    cout << endl;
    return 0;
}

(2)什么是递归

文字解释

首先它叫递归函数。没错,它是函数的用法。它的特点是在一个你定义的函数中调用它自己。当从主函数中跳到这个函数时,它会被执行,遇到一个调用自己的函数声明后,它会从头开始被执行,又遇到那个声明,又开始从头开始执行…
那它不就没完没了地执行下去了吗?没错,是的。求求你,我不想有bug,有什么方法可以结束这个循环?那还不简单,不让它遇到那个声明不就好了!(这就是递归的关键了)

下面就是本文章的重点了,没错,上面都不重要。


(3)用递归函数写选择排序

例题:编写一个用递归来实现选择法排序,并使用函数作为模板。
解决问题的代码:

#include <iostream>
using namespace std;

//这就是一个递归数组
void sort(int x[], int n, int index)//它的名字叫sort,括号里面是三个桶,装三个数据,分别是x[]:一维数组中的十个数据,n:数据的个数,index:首个数据的下标
{
    if (index >= n - 1)             //这是sort函数的终止条件,没有这个语句会十分尴尬。下标index已经到第n-i个数的位置时结束这个函数的运行。
        return;
    else                            //index没到第n-1个数的位置,则执行下面的语句
    {                               //下面是选择排序的代码原理
        int min = x[index], ii = index;//min(最小值)为第一个数(x[index](index=0)),ii为前面提到的k。
        for (int j = index + 1; j < n; j++)//这是比较大小
            if (x[j] < min)              //如果有比第一个数小的,则交换位置
            {
                min = x[j];
                ii = j;
            }
        if (ii != index)               //同前,如果最小值是本身,不做变化。如果不是,则将这个最小值与第一位数交换位置
        {
            int t = x[index];
            x[index] = x[ii];
            x[ii] = t;
        }
    }

    sort(x, 10, index + 1);            //这就是之前提到的调用自己的函数声明,这也是递归函数的灵魂!注意:index+1,表示前进一位数
}


int main()          //这就是主函数了
{
    int a[10];
    int i, j;
    for (j = 0; j < 10; j++)
    {
        cin >> a[j];
    }//上面是输入一个数组的代码,不重要
   sort(a, 10, 0);//这就是一个函数的调用,括号里的分别是数组首元素的地址(用于调用数组中的数),数据的个数,第一个数的下标 
    //下面是输出结果,不重要
    for (i = 0; i < 10; i++)
        cout << a[i] << " ";
    cout << endl;
    return 0;
}

其中我觉得最有意思的是index会从0开始,逐步进行推进,直到n-1才结束。

最后我想说的是,(这很重要)这是我在CSDN上的第一篇文章,如果各位大佬发现有什么问题,可以留言。这篇文章是我用心写的,希望大家可以点赞支持一下。记住这一天2021年4月30日,在这一天,我写了第一篇文章!

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在下_诸葛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值