给定一个长度为N的整形数组arr,其中有N个互不相等的自然数1-N。请实现arr的排序,但是不要把下标
位置上的数通过直接赋值的方式替换成
[要求]
时间复杂度为
,空间复杂度为
备注:
第一行有一个整数N。表示数组长度
接下来一行有N个互不相等的自然数1-N。
输出N个整数表示排序后的结果
5 2 1 4 5 3
1 2 3 4 5
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine().trim());
br.readLine();
for(int num = 1; num <= n; num++)
System.out.print(num + " ");
}
} import java.util.*;
public class Main{
public static void main(String arg[]) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] arr = new int[n];
for (int i=0;i<n;i++) {
arr[i] = sc.nextInt();
}
for (int i=0;i<n;i++) {
while (arr[i]!=arr[arr[i]-1]) {
swap(arr, i, arr[i]-1);
}
System.out.print(arr[i]+" ");
}
}
public static void swap(int[] arr, int i, int j) {
if (i==j) return;
arr[i] = arr[i]^arr[j];
arr[j] = arr[i]^arr[j];
arr[i] = arr[i]^arr[j];
}
} #include "iostream"
#include "vector"
using namespace std;
int main()
{
int len;
cin>>len;
vector<int> nums(len);
for(int i=0;i<len;i++)
{
cin>>nums[i];
}
int tmp;
for(int i=0;i<len;i++)
{
while(nums[i]!=i+1)
{
tmp=nums[i];
swap(nums[i],nums[tmp-1]);
}
cout<<nums[i]<<' ';
}
return 0;
} import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] arr = getArr(n);
int[] ints = normalSort(arr, n);
show(ints);
}
private static int[] normalSort(int[] arr, int n){
int count = 0;
while(count < n){
while (count != arr[count]-1){
swap(arr,count,arr[count]-1);
}
count++;
}
return arr;
}
private static void swap(int[] arr,int i, int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
private static void show(int[] arr){
for (int i = 0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
}
private static int[] getArr(int n){
int[] arr = new int[n];
for(int i = n; i > 0; i--){
arr[n-i] = i;
}
return arr;
}
}
const N = Number(readline());
const arr = readline().split(' ').map(Number);
// 长度为N的数组,想要按顺序装入1~N的值
// 排好序后,每个位置上的值和其下标必定满足关系 arr[i] === i + 1;
// 所以遍历原始数组,当遇到不满足 arr[i] === i + 1 条件的,则说明 arr[i] 不应该
// 放在当前的位置 i 上,而是需要移动的,然后就开始移动操作。
let cache; // 缓存当前要移动的数值
let start; // 缓存本轮移动操作是从哪个下标位置开始的
for (let i = 0; i < N; i++) {
if (arr[i] !== i + 1) {
cache = arr[i]; // 用cache缓存当前要移动的值
start = i; // start记录本轮移动开始时的下标位置
let target = cache - 1; // cache值应该被放在的下标位置
// 在不断移动的过程中,只要下一个target位置还没有等于本轮移动开始时的start位置,
// 说明本轮移动过程还没有结束,因为在把各个值放入它应该在的位置的最后,必然会把应该在 start 位置
// 的值给替换出来,所以当本应该在start位置的值被找到后,直接把它放入start位置,此时就没有还在数组之
// 外的值,本轮替换才算结束。
while (target !== start) {
const tmp = arr[target]; // 替换出当前不应该在target位置的值
arr[target] = cache; // 把当前要移动的值放在它本应在的target位置
cache = tmp; // 被替换出的tmp成为下一个要移动的值
target = cache - 1; // target 也更新为下一个要移动的值,也就是 tmp,本应在的位置
}
arr[start] = cache; // 循环结束时,cache中是本应在start位置的值
}
}
console.log(arr.join(' ')); #include<iostream>
using namespace std;
const int N = 1e5+3;
int a[N];
int main() {
int n;
scanf("%d", &n);
for(int i=1;i<=n;++i) scanf("%d", a+i);
for(int i=1;i<=n;++i) {
while(a[i]!=i) {
swap(a[i], a[a[i]]);
}
}
for(int i=1;i<=n;++i) {
printf("%d ", a[i]);
}
}
这TM有啥好说的???
/*
* @Description: 自然数数组的排序
* @Author:
* @Date: 2020-11-13 22:03:44
* @LastEditTime: 2020-11-13 22:10:03
* @LastEditors: Please set LastEditors
*/
#include<iostream>
#include<vector>
using namespace std;
int main(){
int N;
cin >> N;
vector<int> arr(N + 1);
int temp;//暂时存放数
for(int i = 0;i < N;i++){
cin >> temp;
arr[temp] = temp;
}
for(int i = 1;i < arr.size();i++){
cout << arr[i] << " ";
}
system("pause");
return 0;
}
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n,a;
cin>>n;
vector<int> arr;
for(int i=0;i<n;i++)
{
cin>>a;
arr.push_back(a);
}
int middle;
int i=0; //从0下标开始循环
while(i<n)
{
if(arr[i]==i+1) //若该数的位置正确,则循环下一个
{
i++;
}
else
{
middle=arr[arr[i]-1]; //若不正确,找到arr[i]数对应的正确位置,交换一下
arr[arr[i]-1]=arr[i];
arr[i]=middle;
}
}
for(int i=0;i<n;i++)
{
cout<<arr[i];
cout<<" ";
}
return 0;
} N = eval(input())
ls = list(map(int, input().split()))
ls.sort()
print(' '.join(map(str, ls))) N = eval(input())
ls = list(map(int, input().split()))
for i in range(N):
if ls[i] == i+1: # 若位置i上的值为i+1,则位置正确
continue
else: # 若位置i上的值不正确时
i_index = ls.index(i+1) #先确定i+1 的正确位置
# 将值为i+1的位置与位置i互换
ls[i], ls[i_index] = ls[i_index], ls[i]
print(' '.join(map(str, ls)))