目录
一、问题描述
系统定义的堆排序,需要一次遍历全部的元素,也就是说使用系统提供的堆排序必须提前知道全部的需要排序元素。但是对于在排序过程中不断新增排序元素的情况,系统提供的堆排序就不能满足我们的需求,因此需要我们手动改写系统的堆结构。
二、自定义堆
public class MyHeap {
public static class MyMaxHeap{
private int[] heap;
private final int limit;
private int heapSize;
public MyMaxHeap(int limit){
heap = new int[limit];
this.limit=limit;
heapSize=0;
}
public boolean isEmpty(){
return heapSize==0;
}
public boolean isFull(){
return heapSize==limit;
}
public void push(int value){
if (heapSize==limit)
throw new RuntimeException("heap is full");
heap[heapSize]=value;
heapInset(heap,heapSize++);
}
public void heapInset(int[] arr,int index){
while (arr[index]>arr[(index-1)/2]){
swap(arr,index,(index-1)/2);
index=(index-1)/2;
}
}
public void swap(int[] arr ,int i ,int j){
int tmp = arr[i];
arr[i]=arr[j];
arr[j]=tmp;
}
public int pop(){
int ans = heap[0];
swap(heap,0,--heapSize);
heapify(heap,0,heapSize);
return ans;
}
public void heapify(int[] arr,int index ,int heapSize){
int left = index*2+1;
while (left<heapSize){
int largest = left+1<heapSize&&arr[left+1]>arr[left]?left+1:left;
largest = arr[largest]>arr[index]?largest:index;
if (largest==index)
break;
swap(arr,largest,index);
index=largest;
left=index*2+1;
}
}
}
}
三、自定义堆排序
public class HeapSort {
public static void heapSort(int[] arr){
if (arr==null||arr.length<2)
return;
for (int i=0;i<arr.length;i++)
heapInsert(arr,i);
int heapSize = arr.length;
swap(arr,0,--heapSize);
while (heapSize>0){
heapify(arr,0,heapSize);
swap(arr,0,--heapSize);
}
}
public static void heapInsert(int[] arr,int index){
while (arr[index]>arr[(index-1)/2]){
swap(arr,index,(index-1)/2);
index=(index-1)/2;
}
}
public static void swap(int[] arr ,int i,int j){
int tmp = arr[i];
arr[i]=arr[j];
arr[j]=tmp;
}
public static void heapify(int[] arr,int index,int heapSize){
int left = index*2+1;
while (left<heapSize){
int largest = left+1<heapSize&&arr[left+1]>arr[left]?left+1:left;
largest=arr[largest]>arr[index]?largest:index;
if (largest==index)
break;
swap(arr,largest,index);
index = largest;
left=index*2+1;
}
}
public static void comparator(int[] arr){
Arrays.sort(arr);
}
public static int[] generateRandomArray(int maxSize,int maxValue){
int[] arr = new int[(int)((maxSize+1)*Math.random())];
for (int i=0;i<arr.length;i++)
arr[i]=(int)((maxValue+1)*Math.random())-(int)((maxValue+1)*Math.random());
return arr;
}
public static int[] copyArray(int[] arr){
if (arr==null)
return null;
int[] res = new int[arr.length];
for (int i=0;i<arr.length;i++)
res[i]=arr[i];
return res;
}
public static boolean isEqual(int[] arr1,int[] arr2){
if ((arr1==null&&arr2!=null)||(arr1!=null&&arr2==null))
return false;
if (arr1==null&&arr2==null)
return true;
if (arr1.length!=arr2.length)
return false;
for (int i=0;i<arr1.length;i++){
if (arr1[i]!=arr2[i])
return false;
}
return true;
}
public static void printArray(int[] arr){
if (arr==null)
return;
for (int i=0;i<arr.length;i++)
System.out.println(arr[i]+" ");
System.out.println();
}
public static void main(String[] args) {
int testTime = 500000;
int maxSize = 100;
int maxValue = 100;
boolean succeed = true;
for (int i=0;i<testTime;i++){
int[] arr1 = generateRandomArray(maxSize,maxValue);
int[] arr2 = copyArray(arr1);
heapSort(arr1);
comparator(arr2);
if (!isEqual(arr1,arr2)){
succeed=false;
break;
}
}
System.out.println(succeed?"Nice!":"Fuckeing fucked!");
}
}