选择排序是一种简单直观的排序算法。它与冒泡排序很相似,都是比较 n-1 轮,每轮都是比较 n–1–i 次,每轮找出一个最大值或最小值。
选择排序是将每轮找出的最值放到最左边。并且在算法上,选择排序是先保存第一个元素的下标,然后后面所有的数依次与第一个元素相比,如果遇到更小的,则记录更小的那个数的下标,然后后面所有的数都依次与那个更小的数比较,直到最后将最小的数的下标找出来,然后再将这个数放到最左边,即与下标为 0 的数互换。如果最小的数的下标就是 0 那么就不用互换。
所以,选择排序算法是先判断最小的数的下标是不是 0,如果不是则说明最小的数不是第一个元素,则将这个数与第一个元素互换位置,这样一轮下来最小的那个数就被找到并放到了最左边。
在第二轮同样先保存新序列第二个元素的下标,后面所有的数依次与第二个元素相比较,如果遇到更小的则记录更小的那个数的下标,然后后面所有的数都依次与那个更小的数比较,直到最后又找到一个最小的,此时这个最小的在整个序列中是“第二小”。然后再判断这个数的下标是否等于 1,如果不等于 1 说明“第二小”的那个数不是第二个元素,则将这个数与第二个元素互换位置,这样第二轮下来就找到了“第二小”的那个数,并将它放到了第二个位置。如此循环,直到整个序列实现从小到大排序。
如果是从大到小排序,那么就记录大的那个数的下标,每一轮找出一个最大的数放到左边。
从上面的分析可以看出,选择排序是比较一轮才互换一次,而且如果本轮中最小的就是最左边那个数则不用互换。选择排序效率高。
下面一个程序,用选择排序实现一个序列的从小到大排序:
#include<stdio.h>
int Zz(int n)
{
int i,j;
int t,MinIndex;
int a[]={6,48,25,19,76,96};
for(i=0;i<n-1;++i)
{
MinIndex=i;
for(j=i+1;j<n;++j)
{
if(a[MinIndex]>a[j])
{
MinIndex=j;
}
}
if(MinIndex!=i)
{
t=a[MinIndex];
a[MinIndex]=a[i];
a[i]=t;
}
}
printf("最后排序结果为:\n");
for(i=0;i<n;i++)
{
printf("%d ",a[i]);
}
return a[i];
}
int main()
{
Zz(6);
return 0;
}
#include<stdio.h>
int main()
{
int i,j;
int t,MinIndex;
int a[]={6,48,25,19,76,96};
for(i=0;i<6-1;++i)
{
MinIndex=i;
for(j=i+1;j<6;++j)
{
if(a[MinIndex]>a[j])
{
MinIndex=j;
}
}
if(MinIndex!=i)
{
t=a[MinIndex];
a[MinIndex]=a[i];
a[i]=t;
}
}
for(i=0;i<6;i++)
{
printf("%d ",a[i]);
}
return 0;
}
//选择排序,从大到小顺序降序后输出//
#include<stdio.h>
int main()
{
int i,j,t,MaxIndex;
int a[]={12,23,45,53,13,76,98,78,54,72};
int n=(sizeof(a)/sizeof(a[0]));
for(i=0;i<n;i++) {
printf("%d ",a[i]);
}
for(i=0;i<n-1;++i) {
MaxIndex=i;
for(j=i+1;j<n;++j) {
if(a[MaxIndex]<a[j]) {
MaxIndex=j;
}
}
if(a[MaxIndex]!=i) {
t=a[MaxIndex];
a[MaxIndex]=a[i];
a[i]=t;
}
}
printf("\n最后输出结果为:\n");
for(i=0;i<n;i++) {
printf("%d ",a[i]);
}
return 0;
}