堆排序


堆排序算法描述+代码实现

在处理大数据的时候有时候会用到这个堆的数据结构。

网上对于解决海量前K大问题比较常用的方法就是堆排。我们知道,使用堆排序是要求堆可以放入内存啊,这么大的数据,怎么放?这里有一个技巧,内存中并不是放入所有数据的堆,而是放入K大小的堆,我们知道堆调整的复杂度为lgK,使用K大小的堆,文件遍历一遍我们就可以求出前K大,所以复杂度是NlgK,N是词的个数,只不过这个“遍历”是文件操作,系数要比在内存中“遍历”的系数要大一些。

/**
 * @author zhailz
 * 堆排序,不稳定的算法,最好的情况O(nlogn),最坏的情况O(nlogn),平均的情况是O(nlogn)
 */
public class HeapSort {

  public static void main(String[] args) {
    int[] arrays = new int[] { 5, 1, 6, 2, 4, 10, 16, 0 };
    hearpSort(arrays);
    System.out.println(Arrays.toString(arrays));
  }

  public static int[] hearpSort(int[] arrays) {
    creatheap(arrays);
    System.out.println(Arrays.toString(arrays));
    for (int i = arrays.length - 1; i > 0; i--) {
      swap(arrays, 0, i);
      mainHeap(arrays, 0, i);
    }
    return arrays;
  }

  public static int[] creatheap(int[] arrays) {
    for (int i = arrays.length / 2; i >= 0; i--) {
      mainHeap(arrays, i, arrays.length);
    }
    return arrays;
  }

  private static void mainHeap(int[] arrays, int i, int length) {
    //
    int largest = i;
    if (left(i) < length && arrays[left(i)] > arrays[largest]) {
      largest = left(i);
    }

    if (right(i) < length && arrays[right(i)] > arrays[largest]) {
      largest = right(i);
    }

    if (largest != i) {
      swap(arrays, i, largest);
      mainHeap(arrays, largest, length);
    }
  }

  private static void swap(int[] arrays, int i, int largest) {
    int temp = arrays[i];
    arrays[i] = arrays[largest];
    arrays[largest] = temp;
  }

  private static int left(int i) {
    return 2 * i + 1;
  }

  private static int right(int i) {
    return 2 * i + 2;
  }
}



上一篇  归并排序 下一篇   简单选择排序