算法概述:
【官方描述】
第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,
然后再从剩余的未排序元素中寻找到最小(大)元素,放到已排序的序列的末尾。
以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。
C语言实现:
#include<stdio.h>
void Swap(int a[],int i,int j)
{
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
void SelSort(int a[],int n)
{
int i,j;
for(i = 0;i < n-1;i++)
{
int min = i;//寻找最小值
for(j = i+1; j < n;j++)
{
if(a[j] < a[min])//寻找未排序序列中的最小值
{
min = j;
}
if(min != i)
{
Swap(a,min ,i);
}
}
}
}
int main()
{
int i;
int a[]={2,4,6,23,12,6};
int n = sizeof(a)/sizeof(int);
SelSort(a,n);
for(i = 0; i < n;i++)
{
printf("%d\t",a[i]);
}
printf("\n");
return 0;
}
运行结果:
与冒泡排序不同,冒泡排序通过依次交换两个顺序不合法的元素位置,从而将当前最小(大)元素放到合适的位置;而选择排序每遍历依次都记住了当前最小(大)的元素的位置,最后仅需一次交换操作即可将其放到合适的位置。
选择排序是不稳定的算法,在一趟选择中,如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。就比如说 3,5, 4,3, 2,在第一趟中,2会和第一个3交换位置,但是这样的话就会使得两个3的相对位置发生变化。