给定一个长度为N的整型数组arr,其中有N个互不相等的自然数1~N,请实现arr的排序,但是不要把下标0~N-1位置上的数值通过直接赋值的方式替换成1~N。
要求:时间复杂度为O(N),额外空间复杂度为O(1)。
思路:
1.从左向右遍历arr,假设当前遍历到i位置。
2.if arr[i]==i+1,不需要调整,继续遍历。
3.if arr[i]!=i+1,进行调整。
根据调整功能的方法不同,可以有不同的实现过程。
方法一:
public static void sort1(int[] arr) {
int tmp = 0;
int next = 0;
for (int i = 0; i != arr.length; i++) {
tmp = arr[i];
while (arr[i] != i + 1) {
next = arr[tmp - 1];
arr[tmp - 1] = tmp;
tmp = next;
}
}
}
方法二:
public static void sort2(int[] arr) {
int tmp = 0;
for (int i = 0; i != arr.length; i++) {
while (arr[i] != i + 1) {
tmp = arr[arr[i] - 1];
arr[arr[i] - 1] = arr[i];
arr[i] = tmp;
}
}
}