排序-简单选择排序

版权声明:转载请注明出处。 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);      }
   }
}

猜你喜欢

转载自blog.csdn.net/baidu_38304645/article/details/83115770
今日推荐