计数排序
计数排序思想:
计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。
计数排序(Counting sort)是一种稳定的排序算法。计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置。它只能对整数进行排序。
算法描述
找出待排序的数组中最大和最小的元素;
统计数组中每个值为i的元素出现的次数,存入数组C的第i项;
对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加);
反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1。
动画展示:
原代码:
void counting_sort(vector<int>& array) { if (array.empty()) return; //找到数中的最大值和最小值 int max = array[0]; int min = array[0]; for (int i = 1; i < array.size(); i++) { if (min > array[i]) min = array[i]; else if(max < array[i]){ max = array[i]; } } // 记录各元素出现次数 vector<int> counts(max + 1); // 设定内存大小 for (int i = 0; i < array.size(); i++){ counts[array[i]]++; } // 根据记录的次数输出对应元素 int index = 0; for (int j = 0; j < counts.size(); j++){ int n = counts[j]; while (n--){ array[index] = j; index++; } } }
改进内存后代码:
void counting_sort(vector<int>& array) { if (array.empty()) return; //找到数中的最大值和最小值 int max = array[0]; int min = array[0]; for (int i = 1; i < array.size(); i++) { if (min > array[i]) min = array[i]; else if(max < array[i]){ max = array[i]; } } // 记录各元素出现次数 vector<int> counts(max - min + 1); // 减少内存 for (int i = 0; i < array.size(); i++){ counts[array[i] - min]++; } // 根据记录的次数输出对应元素 int index = 0; for (int j = 0; j < counts.size(); j++){ int n = counts[j]; while (n--){ array[index] = j + min; index++; } } }