算法导论笔记(四) : 计数排序
2014-07-09 16:34
218 查看
1 计数排序概述
计数排序假设待排序数组中每一个元素都是0到k间的一个整数.如果k = O(n),则计数排序运行的时间为O(n).2 计数排序执行过程
(i) 填充辅助数组C(C的长度为K),数组A中的每一个元素都在C的对应位置加1.(ii) 对C进行计算使得C[i] = C[i] + C[i-1]
(iii)从后向前遍历A数组,根据该元素的值找到C中对应位置的数。将该数字作为索引将当前元素填到结果数组B中.
(iv)C中对应位置的值减1.
下边是一个8个元素的数组A的计数排序过程:
3 代码实现
#ifndef __COUNTINGSORT_H__ #define __COUNTINGSORT_H__ #include <malloc.h> #include <stdlib.h> #include <stdio.h> #include <time.h> class Countingsort { int* m_data_input; int* m_data_output; int* m_counter; int m_size; int m_k; public: Countingsort(int size ,int k); ~Countingsort(); void Sort(); bool Verify(); void Create(); }; #endif
#include "Countingsort.h" Countingsort::Countingsort(int size,int k) { m_size = size; m_k = k; m_data_input = (int*)malloc(sizeof(int)*size); m_data_output = (int*)malloc(sizeof(int)*size); m_counter = (int*)malloc(sizeof(int)*k); } Countingsort::~Countingsort() { if(m_data_input) { free(m_data_input); free(m_data_output); free(m_counter); } } void Countingsort::Create() { srand((unsigned)time(NULL)); for(int i=0;i< m_size;i++) { m_data_input[i] = rand() % m_k; } } void Countingsort::Sort() { for(int i=0;i<m_k;i++) { m_counter[i] = 0; } for(int j=0;j<m_size;j++) { m_counter[m_data_input[j]]++; } for(int i=1;i<m_k;i++) { m_counter[i] = m_counter[i] + m_counter[i-1]; } for(int v = m_size-1;v>=0;v--) { m_data_output[m_counter[m_data_input[v]]-1] = m_data_input[v]; m_counter[m_data_input[v]]--; } } bool Countingsort::Verify() { int oldValue = m_data_output[0]; for(int i=1;i<m_size;i++) { if(m_data_output[i]<oldValue) { return false; } oldValue = m_data_output[i]; } return true; }
#include "Countingsort.h" int main() { int size = 1000* 1000; int k =1024; Countingsort pSort(size,k); pSort.Create(); pSort.Sort(); if(pSort.Verify()) { printf("Success \n"); } else { printf("error \n"); } return 0; }
4 性能分析
(i)计数排序的性能是O(n),优于基于元素比较的排序算法(ii)计数排序是稳定的排序: 输入输出数组中相同值的顺序不变.
相关文章推荐
- 《算法导论》笔记 第8章 8.2计数排序
- 算法导论笔记——计数排序
- 算法导论学习笔记(3)---计数排序
- 算法导论学习笔记(一)排序算法之计数排序
- 《算法导论》笔记 第8章 8.2计数排序
- 算法导论学习笔记-第十五章-动态规划
- 算法导论学习笔记-第5章 概率分析和随机算法
- 算法导论学习笔记-第十七章-平摊分析
- 算法导论学习笔记-第9章 中位数和顺序统计学
- 算法导论 第八章计数排序(counting sort)
- 《算法导论》笔记--红黑树(二)
- 算法导论学习笔记-第二十二章-图的基本算法
- 算法导论学习笔记-第3章 函数的增长
- 算法导论学习笔记-第十九章-二项堆
- 算法导论学习笔记-第8章 线性时间排序
- 算法导论学习笔记-第七章-快速排序
- 《算法导论》笔记--优先级队列
- 算法导论学习笔记-第二十一章-用于不相交集合的数据结构
- 《算法导论》笔记--红黑树(一)
- 算法导论学习笔记-第四章-递归式