排序算法 之 选择排序

        咳咳~选择排序,非常简单的算法…我自己经常用,因此写这段代码大约只要30秒…当初去参加CVTE面试,一面的最后是写一段代码,我原先的思路要用到二分查找思想,可惜写着写着就卡壳了…面试官提醒我时间不多了,于是我放弃了时间复杂度O(n*logn)的算法,在极短的时间内直接写了一个时间复杂度O(n^2)的类似选择排序的算法给他。虽然性能不高,但至少向他证明了我最最基本的代码能力。大概也正因为这段神速写完的代码,再加上面试官本身人很nice,我才顺利地通过了一面。

        好了,回忆完了,说正事儿~

        选择排序:最常见的排序算法之一,时间复杂度O(n^2),空间复杂度O(1),是不稳定的排序算法。代码实现:

void SelectSort(int x[], int n) //选择排序,升序
{
  int i, j, iMin, temp;
  for (i=0; i<n-1; i++)
  {
    iMin = i;
    for (j=i+1; j<n; j++)
      if (x[j] < x[iMin])
        iMin = j;
    temp = x[i];
    x[i] = x[iMin];
    x[iMin] = temp;
  }
}
        会不会觉得,用中间变量 temp 显得很老土呢?其实我也有点这么觉得= =||…So,我们改用异或计算交换数值吧!不仅节省了4个字节的内存,还能装装逼,真可谓一举两得!

void SelectSort(int x[], int n)
{
  int i, j, iMin;                 // 不再需要中间变量 temp
  for (i=0; i<n-1; i++)
  {
    iMin = i;
    for (j=i+1; j<n; j++)
      if (x[j] < x[iMin])
        iMin = j;
    if (i != iMin)                // 切记:异或交换两个数的值,一定不能用同一块内存异或它本身,否则结果恒为0
    {
      x[i] = x[i] ^ x[iMin];
      x[iMin] = x[i] ^ x[iMin];
      x[i] = x[i] ^ x[iMin];
    }
  }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值