算法原理
一次遍历中找出数组中最大的值,放在待排序序列的最后
排序趟数
当待排序序列只有一个元素时,排序完成
因此需排序 n-1 趟
每趟排序的区间
第 i 趟排序时,待排序序列区间为 [0,n-i]
例如排序数组 [ 5, 3, 1, 2, 4 ]
一:
二:
三:
四:
算法测试代码
#include<stdio.h>
void prin(int t[],int n)
{
for(int i=0; i<n; i++)
printf("%d ",t[i]);
printf("\n");
}
//选择排序
void SelectSort(int t[],int n)
{
for(int i=0; i<n-1; i++)
{
int max=t[0],maxp=0;
for(int j=1; j<n-i; j++)
{
if(t[j]>max)
{
max=t[j];
maxp=j;
}
}
int tem=t[n-1-i];
t[n-1-i]=t[maxp];
t[maxp]=tem;
printf("第%d趟排序完成(交换了%d和%d):",i+1,t[maxp],t[n-i-1]);
prin(t,n);
}
}
int main()
{
int t[]= {5,3,1,2,4};
int n=sizeof(t)/sizeof(int);
printf("原数组:");
prin(t,n);
SelectSort(t,n);
printf("排序完成后:");
prin(t,n);
return 0;
}
优化
在交换前判断
if(t[n-1-i]!=t[maxp])
{
int tem=t[n-1-i];
t[n-1-i]=t[maxp];
t[maxp]=tem;
}
时间复杂度 :O(n^2)
空间复杂度 :O(1)
稳定性 :不稳定