自然数数组的排序

自然数数组的排序

一、题目

给定一个长度为 N 的整形数组 arr,其中有 N 个互不相等的自然数 1 – N。请实现 arr 的排序,但是不要把下标0 – N−1 位置上的数通过直接赋值的方式替换成1 – N

二、思路

此题目比较简单。数组长度为 N,存储的元素是 1 – N,但是是乱序的。我们想要的结果是:

arr[i] = i+1 这个表达式成立,因此我们遍历这个数组,遇到表达式成立的,直接跳过;遇到表达式不成立的,我们进行交换,把当前位置的元素和这个元素应该出现的位置处的元素进行交换,交换完继续判断表达式是否成立。直到数组遍历完成

三、代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <vector>
#include <iostream>
#include <algorithm>

class Solution {
public:
void sort_01(std::vector<int>& arr) {
int i = 0;
for (; i < arr.size();) {
if (arr[i] == i+1) {
i++;
} else {
std::swap(arr[i], arr[arr[i]-1]);
}
}
}
};

void print_arr(const std::vector<int>& arr) {
for (const auto x : arr) {
std::cout << x << " ";
}
std::cout << std::endl;
}

int main() {
Solution s;
std::vector<int> arr{2,1,4,5,3};
s.sort_01(arr);
print_arr(arr);
return 0;
}

时间复杂度是:O(n)