如何简单验证计数排序(counting sort)稳定性?

发布于 2017-09-24 10:32:23 字数 2 浏览 1207 评论 1

如题

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

清晨说ぺ晚安 2017-09-25 17:14:57

计数排序可以分解为如下几步:

遍历数组
记录当前遍历项
顺序输出计数器中的非空项

从中可以看出,对于数组中相等的项,在数组中 index 较小的,会先进入计数器的记录中,所以如果需要稳定性,则只需要计数器采用FIFO的设计模式(Queue)即可。

如输入项为

struct DataPack {
  int intVal;
  char data;
};
DataPack data[3] = {{0, 'a'}, {1, 'b'}, {0, 'c'}};

按照第一项int进行排序,使用计数器为

vector< queue< DataPack *> > counter(INT_MAX);

遍历代码也很简单

for (int i = 0; i < 3; ++i) {
  counter[data[i].intVal].push(&data[i]);
}

输出代码

for (int i = 0; i < INT_MAX; ++i) {
  while (counter[i].empty() == false) {
   cout << counter[i].front().intVal << ":" << counter[i].front().data << endl;
   counter[i].pop();
  }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文