前面已经记录过插入排序,归并排序,快速排序,堆排序等四种排序。它们都有个共性,就是通过多次比较来得出前后顺序,这种叫做比较排序,当然除此之外也有非比较排序。今天记录的计数排序就是一种非比较排序。
算发思想: 有一串数据,如果我们知道每一个元素升序在数组中的第几个,那么我们就知道了升序的结果。而对于如何知道每个元素在数组中的第几个,可以创建一个cout为数组中最大元素值得数组a,初始化都为0,然后遍历数组,每碰到一个元素,以此元素为下标对应的a[元素]++;然后遍历数组a输出对应的索引值,多个就输出多次 输出结果既是排序后结果。
时间复杂度: 当数组中最大元素为k时,若k=O(n),运行时间为 Θ(nlgn)
c++实现:
// test_1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include<vector>
using namespace std;
#pragma region 计数排序
void JishuSort(vector<int>& list)
{
int* a = new int[11];
for (int i = 0; i < 11; i++)
{
a[i] = 0;
}
for (int i = 0; i < list.size(); i++)
{
a[list[i]]++;
}
int index = 0;
for (int i = 0; i < 11; i++)
{
int num = a[i];
for (int j = 0; j < num; j++)
{
list[index] = i;
index++;
}
}
}
#pragma endregion
int main()
{
int index = 1;
vector<int> intput_array;
int num;
cout << "输入一串数组(取值范围0(包含)-10(包含)):";
while (true)
{
cin >> num;
intput_array.push_back(num);
if (cin.get() == '\n')
break;
}
int length = intput_array.size();
cout << "排序结果为:" << endl;
#pragma region 计数排序
JishuSort(intput_array);
for (int i = 0; i < length; i++)
{
printf("%d ", intput_array[i]);
}
#pragma endregion
return 0;
}