算法之直接选择排序

选择排序的基本思想:每次都从待排序的文件中选择出排序码最小的记录,将该记录放于已排序文件的最后一个位置,直到已排序文件记录个数等于初始待排序文件的记录个数位置。 这种思路导致的结果便是排出来的序列为从大到小;

选择排序主要分:
1. 直接选择排序
2. 树形选择排序
3. 堆排序

直接选择排序

直接选择排序是一种简单的方法,首先从所有的n个待排序的记录中选择排序码最小的记录,将该记录与第一个记录交换,再从剩下的n-1个记录中选择最小的记录与第二个记录做交换。一次循环,知道剩下两个记录时,再从中选出最小的记录与第n-1个记录交换。剩下的那一个记录肯定是最大的记录。
当选出来的i-1个记录放在前i-1个位置,接下来从剩余的n-(i-1)个记录中选出最小的记录与第i个记录交换。这里只要设置一个变量记下在查找过程中最小记录的位置,知道查完n-(i-1)个记录。只要最小的位置不为i,就将最小的排序码对应的记录与第i个记录交换;

void simpleSelectSort(table *tab){
int i ,j,k;
for(i=1;i<=tab->length-1;i++)//每次选择一个最小的位置,并与第i个位置交换
{
     k=i;   //用于记录下最小记录的位置
     for(j=i+1;j<tab->length;j++)//向右查找更小的记录
      {
        if(tab->r[j].key<tab->tab->r[k].key)
        k=j;  //如果有更小的记录,更改k的位置
      }
      if(k!=i)     //只要最小的位置不为i,就将最小的排序码对应的记录与第i个记录交换;

      {
        tab->r[0]=tab->r[k];  //用没有使用的0记录来作为交换的中介
        tab->r[k]=tab->r[i];
        tab->r[i]=tab->r[0];
      }
  }
} 

直接选择排序
时间复杂度 O(N^2). 使用一个存储记录的附加空间
不稳定;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值