当前位置: 首页 > 后端技术 > Java

算法回顾2——堆排序与快速排序

时间:2023-04-01 20:13:41 Java

1堆排序步骤(以升序为例,数组末尾为排序后的最大值):从最后一个非叶子节点开始(叶子节点不自然需要调整,第一个非叶子节点arr.length/2-1),从左到右,从下到上调整,最后将一个无序序列构造成一个大根堆,此时序列头是最大值。将头元素与尾元素交换,使尾元素最大,即把最大的元素“下沉”到数组尾部。然后继续调整堆;然后将堆顶元素与次端元素交换,得到第二大元素;如此重复交换、重构、交换。导入java.util.ArrayList;导入java.util.Arrays;公共类HeapSort{publicstaticvoidmain(String[]args){int[]arr={7,6,7,11,5,12,3,0,1};System.out.println("排序前:"+Arrays.toString(arr));排序(arr);System.out.println("排序后:"+Arrays.toString(arr));}publicstaticvoidsort(int[]array){//1.构建大顶堆//从第一个非叶子节点开始,从左到右,从下到上调整for(inti=array.length/2-1;i>=0;i--){adjustHeap(数组,我,array.length);}//2。反复交换堆顶元素和堆尾元素,最终完成排序for(inti=array.length-1;i>0;i--){swap(array,0,i);adjustHeap(数组,0,i);}}//调整大顶堆//len表示调整到数组的元素个数,例如第n轮交换就是倒数第n个元素与top交换,则len=array.length-npublicstaticvoidadjustHeap(int[]array,intindex,intlen){inttemp=array[index];for(inti=index*2+1;itemp){array[index]=array[i];//这里只把子节点的值赋给父节点,不交换index=i;////index调整到被替换的子节点的位置,继续看子结构有没有混乱}elsebreak;}array[index]=temp;//将temp的值放到最后的位置}publicstaticvoidswap(int[]array,inta,intb){inttemp=array[a];数组[a]=数组[b];数组[b]=温度;}}2快速排序重点:publicstaticvoidquickSort(int[]array,intleft,intright){}方法每次将右指针向左移动,保证l和r最后一次相遇对应的值必须小于参考点的值,所以直接用这个点交换参考点即可导入java.util.Arrays;publicclassQuickSort{publicstaticvoidmain(String[]args){int[]array={10,7,2,4,7,62,3,4,2,1,8,9,19};快速排序(数组);System.out.println(Arrays.toString(array));}publicstaticvoidquickSort(int[]array){quickSort(array,0,array.length-1);publicstaticvoidquickSort(int[]array,intleft,intright){if(left>right)return;inttemp=数组[左];intl=左,r=右;while(l=temp&&l