class ScaleSort { public: vector<int> sortElement(vector<int> A, int n, int k) { // write code here if(n < 2) return A; int tmp[k]; for(int i=0;i<k;i++){ tmp[i] = A[i]; } //建立一个小根堆 BuildHeap(tmp,k); //调整从第0个到第n-k个数,每次堆顶放在A中的相应位置 for(int i=0;i<n-k;i++){ A[i] = tmp[0]; tmp[0] = A[i+k]; ChangeHeap(tmp,k,0); } //调整最后的小根堆中的数 for(int i=n-k;i<n;i++){ //堆顶放入有序数组A中 A[i] = tmp[0]; if(i == n-1) break; //调整堆中最后一个数和第一个数 //每次都少一个数,所以k-- tmp[0] = tmp[--k]; ChangeHeap(tmp,k,0); } return A; } void swap(int* A,int low, int high){ int temp = A[low]; A[low] = A[high]; A[high] = temp; } void BuildHeap(int* A, int n) { int i = n / 2 - 1; for (; i >= 0; --i)//从最后一个非叶子节点开始调整 ChangeHeap(A, n, i); } void ChangeHeap(int* A, int size, int root) { int left = 2 * root + 1;//当前节点的左节点 int right = 2 * root + 2;//当前节点的右节点 int largei = root;//先令根节点为最大值的节点 if (left < size && A[left] < A[largei]) largei = left;//如果左子树大于根节点 if (right < size && A[right] < A[largei]) largei = right;//右子树大于根节点 if (largei != root) { swap(A, root, largei);//交换根节点和左右子树中最大的节点 ChangeHeap(A, size, largei);//交换完之后,如果破坏了下边的堆结构,需要递归调整 } } };
时间: 2024-10-10 10:16:15