有1,2,……一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂度为O(1),使用交换,而且一次只能交换两个数。
这个是以前看到的算法题,题目不难。但是要求比较多,排序算法中,时间复杂度为O(n)就是基数排序了。
现在介绍两种解法:
解法一:用数组特性——下标实现交换
扫描数组,每次arr[i],arr[arr[i]-1]交换,如果arr[i]=i+1,则什么都不做。这样交换一次保证一个数字被放到它应该被放置的位置上。最后数组有序。
#include#include using namespace std;void swap(int& a, int& b){ a^=b; b^=a; a^=b;}vector & Sort(vector & vec1){ if(vec1.size()==1) return vec1; for(int i=0;i