前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++|计数排序[7]

C++|计数排序[7]

作者头像
福贵
发布2020-02-25 17:39:49
4500
发布2020-02-25 17:39:49
举报
文章被收录于专栏:菜鸟致敬菜鸟致敬

说明

  • 排序的定义

对一序列对象根据某个关键字进行排序。

  • 术语说明

稳定 :如果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。

#include <iostream>
#include <stdlib.h>
#include <vector>
#include <math.h>
#include <algorithm>
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;
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python与MySQL 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档