首先如果数据的大小如果不大的情况下,通排序是可以达到时间复杂度的.
- 这完全使用空间来换时间
- 没有空间的话,通排序的时间复杂度取决于在各个桶内采取的排序算法的时间复杂度.
eg:有数组vector<int> nums = [1,3,2,5,3,7,4,9]
solution:
建立一个数组,大小是nums中最大的数加1,
//找到最大值
auto max_value = max_element(nums.begin(), nums.end());
//建立数组
int arr[*max_value + 1] = {0};
//将数据保存到数组中,下表i对应数据i.arr[nums[i]]中的值对应nums[i]出现的次数
for(int i = 0; i < nums.size(); i++){
++arr[nums[i]];
}
/*可以观察到,nums中没有出现的数据,在arr中对应的位置为0,
所以从i= 0到*max_value + 1进行遍历arr数组,不是0的就打印i,arr等于几就打印几次,
可以观察到这会出现大量的浪费数组空间,所以是用空间换时间的方法
*/
for(int i = 0; i <=