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个数按从小到大进行排序,一共用<mark>n-1次</mark>就可以完成任务。
第一次:找出<mark>n个数</mark>中最小的数,和<mark>第一个数</mark>进行交换;
第二次:找出<mark>n-1个数</mark>(排除第一次找到的数)中最小的数,和<mark>第二个数</mark>进行交换;
第三次:找出<mark>n-2个数</mark>中的最小的数,和<mark>第三个数</mark>进行交换
…
第n-1次:找出<mark>2个数</mark>中的最小的数,和<mark>第n-1个数</mark>进行交换,最后一个数不用排。
代码解释
例题:对输入的十位数进行选择排序。
#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日,在这一天,我写了第一篇文章!