由一道算法面试题所引发的思考:
题目:给定一个数组a, 设计算法判断该数组中是否存在重复的元素。
要求:空间复杂度O(1) 时间复杂度尽量低;
这道题的答案是采用非递归的堆排序算法实现。(时间复杂度O(n) 空间复杂度O(1))
注:如果是递归实现的堆排序 空间复杂度为O(logn)
下面直接贴代码。
堆排序递归:
// 交换元素
void swap(int *p1, int *p2)
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
// 建立大根堆
void buildHeap(int *A, int n)
{
for(int i = n / 2; i > -1; --i)
{
adjustHeap(A, i, n);
}
}
// 调整堆
void adjustHeap(int *A, int idx, int n)
{
int ldx =