通过对每个元素的个数进行统计,然后按照顺序重新填充数组来完成排序。
算法描述
- 统计数组中 -1、0 和 1 的个数,分别记为 n1、n2 和 n3;
- 将数组的前 n1 个元素赋值为 -1;
- 将数组的第 n1 + 1到 n1 + n2 个元素赋值为 0;
- 将数组的最后 n3 个元素赋值为 1。
时间复杂度分析
- 统计元素个数:遍历数组一次,统计 -1、0、1 的个数。时间复杂度为 O(n)。
- 填充数组:根据统计的结果,重新填充数组,需要再次遍历数组,总共赋值 n 次。时间复杂度为 O(n)。
因此,整个算法的时间复杂度为:
O(n)+O(n)=O(n) (系数始终为1,不考虑系数的累加)
空间复杂度分析
- 额外空间:用于存储 -1、0、1 的个数的计数器 n1、n2 和 n3,以及一些辅助变量。这些变量的数量是常数,与数组的大小无关。
因此,算法所需的额外空间是常数空间:
O(1)
这意味着该算法在处理 n 个元素的数组时,无论数组的大小如何,所需的时间与 n 成正比,而所需的额外空间是固定的常数。
python实现
def sort_special_array(arr):
# 统计 -1、0 和 1 的个数
n1 = n2 = n3 = 0
for num in arr:
if num == -1:
n1 += 1
elif num == 0:
n2 += 1
elif num == 1:
n3 += 1
# 重新填充数组
for i in range(n1):
arr[i] = -1
for i in range(n1, n1 + n2):
arr[i] = 0
for i in range(n1 + n2, n1 + n2 + n3):
arr[i] = 1
return arr
# 测试代码
arr = [0, 1, -1, 0, -1, 1, 1, 0, -1, 0]
sorted_arr = sort_special_array(arr)
print(sorted_arr)#
C++实现
#include <iostream>
#include <vector>
void sortSpecialArray(std::vector<int>& arr) {
// 统计 -1、0 和 1 的个数
int n1 = 0, n2 = 0, n3 = 0;
for (int num : arr) {
if (num == -1) {
n1++;
} else if (num == 0) {
n2++;
} else if (num == 1) {
n3++;
}
}
// 重新填充数组
int index = 0;
for (int i = 0; i < n1; i++) {
arr[index++] = -1;
}
for (int i = 0; i < n2; i++) {
arr[index++] = 0;
}
for (int i = 0; i < n3; i++) {
arr[index++] = 1;
}
}
int main() {
std::vector<int> arr = {0, 1, -1, 0, -1, 1, 1, 0, -1, 0};
sortSpecialArray(arr);
// 输出排序后的数组
for (int num : arr) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
结果
-1 -1 -1 0 0 0 0 1 1 1