1、环境配置:
- 系统:win10
- 编程语言:C++
- 编译器:DevC++
2、算法思想:
- 思路:在n个中找到一个最大(小)的,放到n个的最前面,然后在n-1个中继续找最大(小)放到n-1个的最前面,大问题就会划分为小问题。
- 实现:从数组的第l项到第h项中找最大(小),放到第一位,然后在第l+1项到第h项中找最大(小),放到第二位,如此执行下去。直到l=h,则停止。
3、代码:
/*
《选择排序》
给A[]一个数组,不论是否有序都会排成从小到大的顺序。
*/
#include<iostream>
using namespace std;
void sort(int n,int a[]);
int Dsort(int l,int h,int a[]);
//主函数
int main()
{
int A[] = {5,4,3,2,1};
for(int v=0; v<sizeof(A)/sizeof(A[0]); v++){
cout<<A[v]<<",";
}
cout<<""<<endl;
// sort(sizeof(A)/sizeof(A[0]),A);
Dsort(0,4,A);
for(int v=0; v<sizeof(A)/sizeof(A[0]); v++)
{
cout<<A[v]<<",";
}
return 0;
}
//循环实现选择排序函数
void sort(int n,int a[]){
if(sizeof(a) < 1){
cout<<"empty arry";
}
for(int i=0 ; i<n ; i++){
//从i到最后一项中找最小项对应的下标
int min = a[i];
int z = i;
for(int m = i ; m < n ; m++){
if(min > a[m]){
min = a[m];
z = m;
}
}
//将首项和最小数交换
int sw = 0;
sw = a[z];
a[z] = a[i];
a[i] = sw;
}
}
//递归实现选择排序
int Dsort(int l,int h,int a[]){
if(l==h){
return 0;
}
//找l到h最小值对应的下标
int min = a[l];
int z = l;
for(int s=l; s<(h+1); s++){
if(min>a[s]){
min = a[s];
z = s;
}
}
//交换a[l]和a[z];
int sw = 0;
sw = a[l];
a[l] = a[z];
a[z] = sw;
//继续调用剩余的数组
Dsort(l+1,h,a);
}
4、结果展示:
5、反思总结:
第一次想直接把递归的选择排序写出来,结果失败了,就先试着写了循环版本的选择排序,然后下午上课的时候复盘的时候,对怎么写递归的程序,有了思路。晚上一试就弄出来了。