一、问题描述
对于一个给定的含有n个元素的数组,利用简单选择排序按元素值递增排序。
二、算法
简单选择排序是将原数组分为有序区和无序区两个部分,有序区中的所有元素都不大与无序区中的元素,初始时有序区为空。经过n-1次排序,每次都将无序区中最小的元素移动到无序区开头(有序区末尾)。
有序区 | 无序区 | |
---|---|---|
排序前 | a [ 0 ] 、 a [ 1 ] ⋯ a [ i − 1 ] a[0]、a[1]\cdots a[i-1] a[0]、a[1]⋯a[i−1] | a [ i ] 、 a [ i + 1 ] ⋯ a [ n − 1 ] a[i]、a[i+1]\cdots a[n-1] a[i]、a[i+1]⋯a[n−1] |
排序后 | a [ 0 ] 、 a [ 1 ] ⋯ a [ i − 1 ] 、 a [ i ] a[0]、a[1]\cdots a[i-1]、a[i] a[0]、a[1]⋯a[i−1]、a[i] | a [ i + 1 ] ⋯ a [ n − 1 ] a[i+1]\cdots a[n-1] a[i+1]⋯a[n−1] |
三、代码
#include<stdio.h>
//交换x、y的值
void fun1(double &x,double &y)
{
double t;
t=x;
x=y;
y=t;
}
//输出函数
void fun2(double a[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%lf ",a[i]);
printf("\n");
}
//简单选择排序函数
void fun3(double a[],int n,int i)
{
int j,k; //k最小元素下标
if(i==n-1)return; //递归出口
else
{
k=i;
for(j=i+1;j<n;j++)
if(a[j]<a[k])
k=j;
if(k!=i)
fun1(a[i],a[k]);
fun3(a,n,i+1);
}
}
int main()
{
int n=10;
double a[]={1,9,6,7.5,4,7.2,8,6.8,8,23};
fun2(a,n);
fun3(a,n,0);
fun2(a,n);
}