问题导入
解法思考
问题需要给一组杂乱无章的0,1,2排序,要求不使用库函数,并且只使用常量空间。在此基础上我立即想到的方案是采用桶排序,具体实现如下:利用一个长度为3byte的数组存储0,1,2的个数,最后再按顺序将元素逐一写回原数组即可。public: void sortColors(vector<int>& nums) { int sum[3] = {0, 0, 0}; vector<int>::iterator it; for (it = nums.begin(); it != nums.end(); it++) { switch(*it) { case (0) : sum[0]++; break; case (1) : sum[1]++; break; case (2) : sum[2]++; break; default : break; } } nums.clear(); for (int i = 0; i < 3; i++) { for (int j = 0; j < sum[i]; j++) nums.push_back(i); } } };
算法总结
桶排序适用于给重复元素较多的数组排序,与这题的情形十分契合。使用的额外空间为常量,复杂度为O(1),整个算法只需要对数组进行两次遍历,时间复杂度为O(n),是比较优良的解法。