优先队列可以用于0(N*logN)时间的排序。
若使数组按从小到大顺序排序,则需构建最大堆Max。
堆排序步骤:
1.若使数组按从小到大顺序排序,则需构建最大堆Max;
2.使用需要排序的数组以线性时间建立一个堆;
3.然后通过每次将堆中的最后元素与第一个元素交换,执行N-1次deleteMax操作,每次将堆的大小缩减1并进行下滤。
//swap函数; public void swap(int[] data,int i,int j) { int temp=data[i]; data[i]=data[j]; data[j]=temp; } private void heapify(int[] data, int i, int len) { int left = 2*i + 1; int right = left + 1; int lastIndex = i; if (left < len && data[left] > data[lastIndex]) { lastIndex = left; } if (right < len && data[right] > data[lastIndex]) { lastIndex = right; } if (lastIndex != i) { swap(data, i , lastIndex); heapify(data, lastIndex, len); } } public void heapSort(int[] data) { if(data == null || data.length < 2){ return; } //建堆 for(int i = data.length-1;i >= 0;i--){ heapify(data,i,data.length); } //排序 for(int i = data.length-1;i >= 0;i--){ swap(data,0,i); heapify(data,0,i); } }