diff --git a/CMakeLists.txt b/CMakeLists.txt index 3edbb2a..89a1042 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.11) project(generallib) add_subdirectory(general) -SET(SRC_SDK sdk_main.c )#生成动态库需要至少包含一个源文件 +SET(SRC_SDK sdk_main.c test/src/heapsort/main.c)#生成动态库需要至少包含一个源文件 add_library(generallib STATIC $ ${SRC_SDK}) link_directories(general/third/lib) set_target_properties(generallib PROPERTIES LINKER_LANGUAGE CXX) diff --git a/general/src/algorithm/sorter.hpp b/general/src/algorithm/sorter.hpp index edc554a..38caf62 100644 --- a/general/src/algorithm/sorter.hpp +++ b/general/src/algorithm/sorter.hpp @@ -44,4 +44,13 @@ int selectsort(T *data,uint64_t len,CompareHanlder handle){ } } } +template +static void adjustHeap(T []arr,int i,int length) { + +} +template +int heapsort(T *data,uint64_t len,CompareHanlder handle){ + +} + #endif //GENERAL_SORTER_H diff --git a/test/src/heapsort/CMakeLists.txt b/test/src/heapsort/CMakeLists.txt new file mode 100644 index 0000000..ba984ad --- /dev/null +++ b/test/src/heapsort/CMakeLists.txt @@ -0,0 +1,4 @@ +cmake_minimum_required(VERSION 3.15) +project(heapsort) + +add_executable(heapsort main.c) \ No newline at end of file diff --git a/test/src/heapsort/main.c b/test/src/heapsort/main.c new file mode 100644 index 0000000..f879cf3 --- /dev/null +++ b/test/src/heapsort/main.c @@ -0,0 +1,183 @@ +/** + * 二叉堆(最大堆) + * + * @author skywang + * @date 2014/03/07 + */ + +#include +#include + +#define LENGTH(a) ( (sizeof(a)) / (sizeof(a[0])) ) + +static int m_heap[30]; // 数据 +static int m_capacity=30; // 总的容量 +static int m_size=0; // 实际容量(初始化为0) + +/* + * 返回data在二叉堆中的索引 + * + * 返回值: + * 存在 -- 返回data在数组中的索引 + * 不存在 -- -1 + */ +int get_index(int data) +{ + int i=0; + + for(i=0; i= m_heap[l]) + break; //调整结束 + else + { + m_heap[c] = m_heap[l]; + c = l; + l = 2*l + 1; + } + } + m_heap[c] = tmp; +} + +/* + * 删除最大堆中的data + * + * 返回值: + * 0,成功 + * -1,失败 + */ +int maxheap_remove(int data) +{ + int index; + // 如果"堆"已空,则返回-1 + if(m_size == 0) + return -1; + + // 获取data在数组中的索引 + index = get_index(data); + if (index==-1) + return -1; + + m_heap[index] = m_heap[--m_size]; // 用最后元素填补 + maxheap_filterdown(index, m_size-1); // 从index位置开始自上向下调整为最大堆 + + return 0; +} + +/* + * 最大堆的向上调整算法(从start开始向上直到0,调整堆) + * + * 注:数组实现的堆中,第N个节点的左孩子的索引值是(2N+1),右孩子的索引是(2N+2)。 + * + * 参数说明: + * start -- 被上调节点的起始位置(一般为数组中最后一个元素的索引) + */ +static void maxheap_filterup(int start) +{ + int c = start; // 当前节点(current)的位置 + int p = (c-1)/2; // 父(parent)结点的位置 + int tmp = m_heap[c]; // 当前节点(current)的大小 + + while(c > 0) + { + // 父节点大于当前节点 + if(m_heap[p] >= tmp) + break; + else + { // 父节点小于当前节点,就调换位置,当前节点作为父节点 + m_heap[c] = m_heap[p]; + c = p; + p = (p-1)/2; // 再把当前节点和上一个父节点在比较大小 + } + } + // 找到合适的索引 + m_heap[c] = tmp; //最后把设置值 +} + +/* + * 将data插入到二叉堆中 + * + * 返回值: + * 0,表示成功 + * -1,表示失败 + */ +int maxheap_insert(int data) +{ + // 如果"堆"已满,则返回 + if(m_size == m_capacity) + return -1; + + m_heap[m_size] = data; // 将"数组"插在表尾 + maxheap_filterup(m_size); // 向上调整堆 + m_size++; // 堆的实际容量+1 + + return 0; +} + +/* + * 打印二叉堆 + * + * 返回值: + * 0,表示成功 + * -1,表示失败 + */ +void maxheap_print() +{ + int i; + for (i=0; i