时间复杂度为O(n),空间复杂度为O(1)的数组排序

前言

做了一道笔试题,要求对时间复杂度为O(n),空间复杂度为O(1)的数组排序,被空间复杂度O(1)搞得有点懵。
原题中O(1)只是表示的额外空间与n无关!!!原题中数组大小n是不确定的,但是元素种类只有0,1,2三种,是一个常量,所以我们可以另外开辟一个大小为3的常量数组(hashtable)来记录每种元素出现的次数,并且hashtable[nums[i]]++亦能够对原数组进行排序,最后按照hashtable元素的顺序和次数输出即可。但是它由于新开辟的数组是大小常量,并不影响空间复杂度,故空间复杂度O(1).

1.引入库

代码如下(示例):

#include<iostream>
#include<vector>
using namespace std;


vector<int> Sort(vector<int>& nums, int nsize) {
	const int numsmax = 3;
	 int hashtable[numsmax];
	 for (int i = 0; i < numsmax; i++) {
		 hashtable[i] = 0;
	 }
	 for (int i = 0; i < nsize; i++) {
		 hashtable[nums[i]]++;
	 }

	 int k = 0;
	 for (int j = 0; j < numsmax; j++) {
		 if (hashtable[j] != 0) 
		 { 
			 while (hashtable[j]--)
			 {
				 nums[k] = j;
				 k++;
			 }
		 }

	 }

	 return nums;
}

int main() {
	vector<int> nums = { 2,2,1,0,2,1 };
	int nsize = nums.size();
	Sort(nums, nsize);

	for (int i = 0; i < nsize-1; i++) {
		cout << nums[i] << ",";
	}
	cout << nums[nsize - 1];
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值