java中常用的七大排序算法(2)

2019-03-28 10:56

堆排序的时间复杂度和空间复杂度分别是O(nlogn)和O(1)。 /**

* @paramint[] 未排序数组 * @return int[] 排完序数组 */

publicint[] sortHeap(int[] array) { buildHeap(array);// 构建堆 int n = array.length; inti = 0;

for (i = n - 1; i>= 1; i--) { swap(array, 0, i); heapify(array, 0, i); }

return array; }

private void buildHeap(int[] array) { int n = array.length;// 数组中元素的个数 for (inti = n / 2 - 1; i>= 0; i--) heapify(array, i, n);

}

private void heapify(int[] A, intidx, int max) {

int left = 2 * idx + 1;// 左孩子的下标(如果存在的话) int right = 2 * idx + 2;// 左孩子的下标(如果存在的话) int largest = 0;// 寻找3个节点中最大值节点的下标 if (left < max && A[left] > A[idx]) largest = left; else

largest = idx;

if (right < max && A[right] > A[largest]) largest = right; if (largest != idx) {

swap(A, largest, idx); heapify(A, largest, max); } }

// 建堆函数,认为【s,m】中只有 s

// 对应的关键字未满足大顶堆定义,通过调整使【s,===================================================== public static void heapAdjust(int[] array, int s, int m) { // 用0下标元素作为暂存单元 array[0] = array[s];

// 沿孩子较大的结点向下筛选

m】成为大顶堆for (int j = 2 * s; j <= m; j *= 2) {

// 保证j为较大孩子结点的下标,j < m 保证 j+1 <= m ,不越界 if (j < m && array[j] < array[j + 1]) { j++; }

if (!(array[0] < array[j])) { break; }

// 若S位较小,应将较大孩子上移 array[s] = array[j];

// 较大孩子的值变成S位的较小值,可能引起顶堆的不平衡,故对其所在的堆进行筛选 s = j; }

// 若S位较大,则值不变;否则,S位向下移动至2*s、4*s、。。。 array[s] = array[0];


java中常用的七大排序算法(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:迪拜转机攻略

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: