版权声明:转载请注明出处。 https://blog.csdn.net/baidu_38304645/article/details/83115770
选择排序的基本思想是:每一趟在n-i+1(i=1,2,..,n-1)个记录中选取关键字最小的记录作为有序序列的第i个记录。其中最简单且为读者熟悉的是简单选择排序。
简单选择排序:每一趟选择出当前最小的交换到最前面,至多N-1趟排序完成。
输入:顺序表的长度,顺序表中各个元素。
输出:排好序的顺序表中各个元素。
运行结果:
辅助宏:
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -1
#define NULL 0
typedef char *InfoType;
typedef int KeyType; //设关键字为整型
顺序表的存储结构定义:
typedef struct
{
KeyType key; //关键字
InfoType otherinfo;//其他数据项
}RedType;
//顺序表的存储结构定义
typedef struct
{
RedType *r; //r[0]一般做哨兵
int length; //顺序表的长度
}SqList;
算法实现:
void SimpleSelectSort(SqList &L)
{
//简单选择排序
//每一趟选择出当前最小的交换到最前面,至多N-1趟排序完成
int i,j,min;
RedType t;
for(i=1;i<L.length;i++)
{
//在L.r[i..L.length]中选择key最小的记录
min=i;
for(j=i+1;j<=L.length;j++)
if(L.r[min].key>L.r[j].key)
min=j;
if(i != min)
{
RedCopy(t,L.r[i]);
RedCopy(L.r[i],L.r[min]);
RedCopy(L.r[min],t);
}
}
}
算法分析:
比较次数:n*(n-1)/2
移动次数最多是3*(n-1).
时间复杂度:O(n^2)
空间复杂度:O(1)
算法本身是不稳定的,但是可以改进使之稳定。
改进:将i到min-1位置的元素后移,将最小值填到i位置。这样就可以实现稳定性,但是肯定增加了移动的时间。
void SimpleSelectSort(SqList &L)
{
//简单选择排序
//每一趟选择出当前最小的交换到最前面,至多N-1趟排序完成
int i,j,min;
RedType t;
for(i=1;i<L.length;i++)
{
//在L.r[i..L.length]中选择key最小的记录
min=i;
for(j=i+1;j<=L.length;j++)
if(L.r[min].key>L.r[j].key)
min=j;
if(i != min)
{
RedCopy(t,L.r[min]); //改进 能稳定 但是耗时。
for(j=min-1;j>=i;j--) // 将i到min-1位置的元素后移 将最小值填到i位置
RedCopy(L.r[j+1],L.r[j]);
RedCopy(L.r[i],t); }
}
}