【笔记】简单选择排序

  简单选择排序是一种简单的选择类排序算法,它是通过依次找到待排序元素序列中最小的数据元素,并将其放在序列的最前面,从而使待排序元素序列变为有序序列。

  基本算法思想:假设待排序的元素序列有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);
}
  • 测试结果


这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值