冒泡排序
前后两两对比进行交换,每轮至少一个数组变得有序(未排序的最大数值找到正确位置)
代码:
java
package Test20250206;
public class BubbleSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr= {2,3,9,4,5,7,0,1};
sort(arr);
for(int i=0;i<arr.length;i++) {
System.out.print(arr[i]+",");
}
}
static void sort(int[] arr) {
for(int j=0;j<arr.length-1;j++) {
for(int i=0;i<arr.length-1;i++) {
if(arr[i]>arr[i+1]) {
int temp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=temp;
}
}
}
}
}
堆排序
流程(从根到叶):
事实上在数组里操作,没有构建二叉树
父子节点之间的规律:
代码:
java
package Test20250206;
import java.util.Arrays;
public class HeapSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr= {2,3,9,4,5,7,1,0};
for(int p=arr.length-1;p>=0;p--) {
sort(arr,p,arr.length);
}
for(int i=arr.length-1;i>0;i--) {
int temp=arr[i];
arr[i]=arr[0];
arr[0]=temp;//堆顶元素和堆底元素进行互换
sort(arr,0,i);
}
System.out.print(Arrays.toString(arr));
}
public static void sort(int[] arr,int parent,int le) {
int temp=arr[parent];//temp作为父节点
int lChild=2*parent+1;//左孩子
while(lChild<le) {
int rChild=lChild+1;//右孩子
if(rChild<le&&arr[lChild]<arr[rChild]) {
lChild++;//右孩子大于左孩子则把左孩子替换为右孩子
}
if(temp>=arr[lChild]) {
break;//父节点值大于孩子节点则直接结束
}
arr[parent]=arr[lChild];//把孩子节点的值赋给父节点
parent=lChild;
lChild=2*lChild+1;
}
arr[parent]=temp;
}
}