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++;
}