排序算法 之 选择排序

        咳咳~选择排序,很是简单的算法…我本身常常用,所以写这段代码大约只要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];
    }
  }
}