C++|计数排序[7]
Posted Python与MySQL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++|计数排序[7]相关的知识,希望对你有一定的参考价值。
说明
排序的定义
对一序列对象根据某个关键字进行排序。
术语说明
稳定 :如果a原本在b前面,而a=b,排序之后a仍然在b的前面;
不稳定 :如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面;
内排序 :所有排序操作都在内存中完成;
外排序 :由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行;
时间复杂度 :一个算法执行所耗费的时间。
空间复杂度 :运行完一个程序所需内存的大小。
计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。
计数排序是一种稳定的排序算法。计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置。它只能对整数进行排序。
算法描述
步骤1:找出待排序的数组中最大和最小的元素;
步骤2:统计数组中每个值为i的元素出现的次数,存入数组C的第i项;
步骤3:对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加);
步骤4:反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1。
using namespace std;
vector<int> countSort(vector<int> todoList)
{
int max = todoList[0], min = todoList[0];
for (int i = 0; i < todoList.size(); i++)
{
if (todoList[i] > max)
{
max = todoList[i];
}
if (todoList[i] < min)
{
min = todoList[i];
}
}
vector<int> tempList;
for (int i = 0; i < (max - min) + 2; i++)
{
tempList.push_back(0);
}
for (int i = 0; i < todoList.size(); i++)
{
tempList[todoList[i] - min]++;
}
vector<int> newList;
for (int j = 0; j < tempList.size(); j++)
{
while (tempList[j] > 0)
{
tempList[j]--;
newList.push_back(j + min);
}
}
return newList;
}
bool isRight(vector<int> myList, vector<int> resultList)
{
for (int i = 0; i < resultList.size(); i++)
{
if (resultList[i] != myList[i])
{
return false;
}
}
return true;
}
int main()
{
vector<int> randomList;
for (int i = 0; i < 1000000; i++)
{
randomList.push_back(rand() % 1000000);
}
vector<int> sortedList = countSort(randomList);
sort(randomList.begin(), randomList.end());
printf("计数排序是否正确:%s", isRight(sortedList, randomList)?"True":"False");
return 0;
}
更多文章:
以上是关于C++|计数排序[7]的主要内容,如果未能解决你的问题,请参考以下文章
八大排序算法C语言过程图解+代码实现(插入,希尔,选择,堆排,冒泡,快排,归并,计数)
8种面试经典!排序详解--选择,插入,希尔,冒泡,堆排,3种快排,快排非递归,归并,归并非递归,计数(图+C语言代码+时间复杂度)
8种面试经典排序详解--选择,插入,希尔,冒泡,堆排,3种快排及非递归,归并及非递归,计数(图+C语言代码+时间复杂度)