void heapsort(int array[],int length){ for(int i = (length-1)/2 ; i >= 0; i--){ heapAdjust(array,i,length); } for(int i = length - 1 ; i > 0 ; i--){ swap(array,0,i); heapAdjust(array,0,i-1); } }
int* heapSort(int* A, int n) { if(NULL == A || n < 2) return A; for (int i = (n >> 1) - 1; i >= 0; --i) heapAdjust(A, i, n); for (int i = n - 1; i > 0; --i) { swap(A[i], A[0]); heapAdjust(A, 0, i); } return A; }
/* * param k : description of k * param nums : description of array and index 0 ~ n-1 * return: description of return */ int kthLargestElement(int k, vector<int> nums) { if(k < 1 || k > nums.size()) return 0; int len = nums.size(); for(int i = nums.size() / 2 - 1; i >= 0; --i) heapAdjust(nums, i, nums.size()); for(int i = nums.size() - 1; i >= len - k; --i) { swap(nums[0], nums[i]); heapAdjust(nums, 0, i); } return nums[len - k]; }
void HeapSort(int *arr,int n) { int i; for(i=n/2;i>=0;i--){ heapAdjust(arr,i,n); } for(i=n-1;i>=0;i--){ swap(arr,i,0); heapAdjust(arr,0,i); } }
vector<int> sortElement(vector<int> A, int n, int k) { if (n < 2) return A; vector<int> myHeap(A.begin(), A.begin() + k); makeHeap(myHeap); for (int i = k; i < A.size(); ++i) { A[i - k] = myHeap[0]; myHeap[0] = A[i]; heapAdjust(myHeap, 0, k); } for (int i = A.size() - k; i < A.size(); ++i) { A[i] = myHeap[0]; swap(myHeap[0], myHeap[k - 1]); heapAdjust(myHeap, 0, --k); } return A; }
elemtype *dePrioQ(PrioQ *q) { if ( q->len == 0 ) return NULL; elemtype *a = q->data[0]; q->data[0] = q->data[q->len-1]; heapAdjust(q->data, --q->len, 0, q->cmp); return a; }
void heap_sort(int a[], int l) { //对顺序表L做堆排序。 int i,j,t; for(i = l/2; i >= 0; --i) //把a[1..L.length]建成大顶堆 heapAdjust(a, i, l); for(i = l; i > 0; --i) { t = a[0]; //将堆顶记录和当前未经排序子序列a[1..i] a[0] = a[i]; //中的最后一个记录相互交换 a[i]=t; heapAdjust(a, 0, i-1); //将L.r[1..i-1]重新调整为大顶堆 } }
/** * @brief 堆排序 * @param R为待排序的数组,size为数组的长度 * 时间复杂度:构建大(小)顶堆,完全二叉树的高度为log(n+1),因此对每个结点调整的时间复杂度为O(logn) * 两个循环,第一个循环做的操作次数为n/2,第二个操作次数为(n-1),因此时间复杂度为O(nlogn) */ void heapSort(int R[], int size) { int i, temp; for ( i = size / 2 - 1; i >= 0; --i ) { //前size/2个为非叶子节点 heapAdjust2(R, i, size -1); //建初始堆 } for ( i = size - 1; i >=1; --i ) { //进行n-1趟堆排序,堆重建后,R[0]最大,放到最后,重新建堆 temp = R[i]; R[i] = R[0]; R[0] = temp;//表尾和表首的元素交换 heapAdjust(R, 0, i - 1);//把表首的元素换成表尾的元素后,重新构成大顶堆,因为除表首的元素外, //后面的结点都满足大顶堆的条件,故heapAdjust()的第二个参数只需为0 } }
void makeHeap(vector<int> &a) { for (int i = a.size() / 2 - 1; i >= 0; --i) heapAdjust(a, i, a.size()); }