题目描述
给定一个长度为N的整形数组arr,其中有N个互不相等的自然数1-N。请实现arr的排序,但是不要把下标0∼N−1位置上的数通过直接赋值的方式替换成1∼N
要求:
时间复杂度为O(n),空间复杂度为O(1)
输入描述:
第一行有一个整数N。表示数组长度
接下来一行有N个互不相等的自然数1-N。
输出描述:
输出N个整数表示排序后的结果
示例1
输入
5
2 1 4 5 3
输出
1 2 3 4 5
解法一:根据题意
import java.io.*;
public class Main{
public static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public static int[] create(int len,String[] ss){
int[] a = new int[len];
for(int i=0;i<len;i++){
a[i] = Integer.parseInt(ss[i]);
}
return a;
}
public static void swap(int[] a,int i,int j){
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
public static void main(String[] args)throws IOException{
int len = Integer.parseInt(br.readLine());
String[] ss = br.readLine().trim().split(" ");
int[] a = create(len,ss);
for(int i=0;i<len;i++){
while(a[i]!=i+1){
swap(a,i,a[i]-1);
}
}
StringBuilder sb = new StringBuilder();
for(int tmp : a){
sb.append(tmp).append(" ");
}
System.out.println(sb.toString());
}
}