這是一個排序題,都是老生常談的東西了,之前用的排序算法都是通過比較大小進行排序,貼一下不用比較大小的計數排序的代碼。
計數排序的思想是:對於數組中一個需要排序的數字x來說,算出數組中小於等於它的數字個數便可得出該數在有序數組中的位置。該算法只適用於整數數組,時間複雜度爲,k爲數字的最大值,是用空間換時間。
對於0-k的數字範圍和數據量n,當k=n時效果最好。
vector<int> sortArray(vector<int>& nums) {
int len = nums.size();
int max_num = -0x3ffff,min_num = 0x3ffff;
for(auto i : nums)
{
max_num = max(max_num,i);
min_num = min(min_num,i);
}
vector<int>cnt(max_num-min_num+1,0);
vector<int>a(len);
for(auto i:nums) //統計數字出現的個數
{
cnt[i-min_num]++;
}
for(int i = 1;i < cnt.size();i++) //算出小於等於它的數字個數
{
cnt[i] += cnt[i-1];
}
for(int i = nums.size() - 1; i >= 0;i--) //從後往前處理保證是穩定排序
{
int j = nums[i] - min_num;
cnt[j]--;
a[cnt[j]] = nums[i];
}
return a;
}