防御间接提示注入攻击:ClawGuard运行时安全框架的设计与实践
2026/8/24 8:04:13
树–07—堆的实现
因为堆数组中的一半 是叶子节点,一半是非叶子节点.
堆数组中最大索引处的父节点,就是最后一个非叶子节点
publicclassHeapSort{//判断heap堆中索引i处的元素是否小于索引j处的元素privatestaticbooleanless(Comparable[]heap,inti,intj){returnheap[i].compareTo(heap[j])<0;}//交换heap堆中i索引和j索引处的值privatestaticvoidexch(Comparable[]heap,inti,intj){Comparabletmp=heap[i];heap[i]=heap[j];heap[j]=tmp;}//根据原数组source,构造出堆heapprivatestaticvoidcreateHeap(Comparable[]source,Comparable[]heap){//把source中的元素拷贝到heap中,heap中的元素就形成一个无序的堆System.arraycopy(source,0,heap,1,source.length);//对堆中的元素做下沉调整(从长度的一半处开始,往索引1处扫描)for(inti=(heap.length)/2;i>0;i--){sink(heap,i,heap.length-1);}}//在heap堆中,对target处的元素做下沉,范围是0~rangeprivatestaticvoidsink(Comparable[]heap,inttarget,intrange){while(2*target<=range){//1.找出当前结点的较大的子结点intmax;if(2*target+1<=range){if(less(heap,2*target,2*target+1)){max=2*target+1;}else{max=2*target;}}else{max=2*target;}//2.比较当前结点的值和较大子结点的值if(!less(heap,target,max)){break;}exch(heap,target,max);target=max;}}}对构造好的堆,我们只需要做类似于堆的删除操作,就可以完成排序。
//对source数组中的数据从小到大排序publicstaticvoidsort(Comparable[]source){//构建堆Comparable[]heap=newComparable[source.length+1];createHeap(source,heap);//定义一个变量,记录未排序的元素中最大的索引intN=heap.length-1;//通过循环,交换1索引处的元素和排序的元素中最大的索引处的元素while(N!=1){//交换元素exch(heap,1,N);//排序交换后最大元素所在的索引,让它不要参与堆的下沉调整N--;//需要对索引1处的元素进行对的下沉调整sink(heap,1,N);}//把heap中的数据复制到原数组source中System.arraycopy(heap,1,source,0,source.length);}packagemain.java.Algorithms.heap;publicclassHeapSort{//判断heap堆中索引i处的元素是否小于索引j处的元素privatestaticbooleanless(Comparable[]heap,inti,intj){returnheap[i].compareTo(heap[j])<0;}//交换heap堆中i索引和j索引处的值privatestaticvoidexch(Comparable[]heap,inti,intj){Comparabletmp=heap[i];heap[i]=heap[j];heap[j]=tmp;}//根据原数组source,构造出堆heapprivatestaticvoidcreateHeap(Comparable[]source,Comparable[]heap){//把source中的元素拷贝到heap中,heap中的元素就形成一个无序的堆System.arraycopy(source,0,heap,1,source.length);//对堆中的元素做下沉调整(从长度的一半处开始,往索引1处扫描)for(inti=(heap.length)/2;i>0;i--){sink(heap,i,heap.length-1);}}//对source数组中的数据从小到大排序publicstaticvoidsort(Comparable[]source){//构建堆Comparable[]heap=newComparable[source.length+1];createHeap(source,heap);//定义一个变量,记录未排序的元素中最大的索引intN=heap.length-1;//通过循环,交换1索引处的元素和排序的元素中最大的索引处的元素while(N!=1){//交换元素exch(heap,1,N);//排序交换后最大元素所在的索引,让它不要参与堆的下沉调整N--;//需要对索引1处的元素进行对的下沉调整sink(heap,1,N);}//把heap中的数据复制到原数组source中System.arraycopy(heap,1,source,0,source.length);}//在heap堆中,对target处的元素做下沉,范围是0~rangeprivatestaticvoidsink(Comparable[]heap,inttarget,intrange){while(2*target<=range){//1.找出当前结点的较大的子结点intmax;if(2*target+1<=range){if(less(heap,2*target,2*target+1)){max=2*target+1;}else{max=2*target;}}else{max=2*target;}//2.比较当前结点的值和较大子结点的值if(!less(heap,target,max)){break;}exch(heap,target,max);target=max;}}}publicclassHeapSortTest{publicstaticvoidmain(String[]args){// //待排序数组String[]arr={"S","O","R","T","E","X","A","M","P","L","E"};Integer[]arr1={2,55,6,-8,36,24,111,88,30};//通过HeapSort对数组中的元素进行排序HeapSort.sort(arr);HeapSort.sort(arr1);//打印排序后数组中的元素System.out.println(Arrays.toString(arr));System.out.println(Arrays.toString(arr1));}}