1. 1~n无序数组时间复杂度为O(n)排序
解题关键点:对于排序后的数组,值和下标满足关系a[i] = i + 1
。
因此,可将其作为交换的终止条件。用for循环遍历数组,判断当前a[i]
是否满足上述等式,如果不满足则两两交换a[i] 和 a[a[i]-1]
的值,继续下一轮循环;若满足等式则执行i++
操作,保证当前位置值不再被交换。直到循环结束即得到了有序的数组。
int temp;
for(int i = 0; i < len; )
{
if (a[i] != i + 1)
{
temp = a[a[i] - 1];
a[a[i] - 1] = a[i];
a[i] = temp;
}
else i++;
}