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