简单选择排序是一种简单的选择类排序算法,它是通过依次找到待排序元素序列中最小的数据元素,并将其放在序列的最前面,从而使待排序元素序列变为有序序列。
基本算法思想:假设待排序的元素序列有n个, 在第一趟排序过程中,从n个元素序列中选择最喜爱哦的元素,并将其放在元素序列的最前面即第一个位置。在第二趟排序过程中,从剩余的n-1个元素中选择最小的元素,将其放在第二个位置。依此类推,指导没有待比较的元素,简单选择排序算法结束。
例如一组元素的关键字序列为(76,31,19,20,6,83,60,52),则简单选择排序的过程如图所示。
简单选择是一种不稳定的排序算法,在最好的情况下,待排序元素序列按照非递减排列,则不需要移动元素;在最坏的情况下,待排序元素按照飞抵增排列,则在每一趟排序都需要移动元素,以哦的那个元素的次数为3(n-1)。在任何情况下,简单选择排序算法都需要进行n(n-1)/2次的比较。综上所述,简单选择排序算法的时间复杂度是 O(n2) 。简单选择排序的空间复杂度是 O(1) 。
- 类型定义
#define MaxSize 50
typedef int KeyType;
typedef struct /*数据元素类型定义*/
{
KeyType key;/*关键字*/
}DataType;
typedef struct /*顺序表类型定义*/
{
DataType data[MaxSize];
int length;
}SqList;
- 简单选择排序函数
void SelectSort(SqList *L,int n)
/*简单选择排序*/
{
int i,j,k;
DataType t;
/*将第i个元素的关键字与后面[i+1...n]个元素的关键字比较,将关键字最小的的元素放在第i个位置*/
for(i=1;i<=n-1;i++)
{
j=i;
for(k=i+1;k<=n;k++) /*关键字最小的元素的序号为j*/
if(L->data[k].key<L->data[j].key)
j=k;
if(j!=i) /*如果序号i不等于j,则需要将序号i和序号j的元素交换*/
{
t=L->data[i];
L->data[i]=L->data[j];
L->data[j]=t;
}
}
}
- 主程序
#include<stdio.h>
#include<stdlib.h>
void InitSeqList(SqList *L,DataType a[],int n)
/*顺序表的初始化*/
{
int i;
for(i=1;i<=n;i++)
{
L->data[i]=a[i-1];
}
L->length=n;
}
void DispList(SqList L,int n)
/*输出表中的元素*/
{
int i;
for(i=1;i<=n;i++)
printf("%4d",L.data[i].key);
printf("\n");
}
void main()
{
DataType a[]={69,62,50,58,42,42,27,53};
SqList L;
int n=sizeof(a)/sizeof(a[0]);
InitSeqList(&L,a,n);
printf("[排序前] ");
DispList(L,n);
SelectSort(&L,n);
printf("[简单选择排序结果]");
DispList(L,n);
}
- 测试结果