public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] num_Array = {10,22,23,152,65,79,85,96,32,1};
//insertSort(num_Array);
//selectSort(num_Array);
//qSort(num_Array,0,num_Array.length-1);
//bubbleSort(num_Array);
heapSort(num_Array);
out(num_Array);
}
public static void out(int[] num_Array) {
for(int i:num_Array) {
System.out.print(i+" ");
}
System.out.println();
}
//插入排序
public static void insertSort(int[] num_Array) {
for(int i=1;i<num_Array.length;i++) {
int temp = num_Array[i];
int j=i-1;
for(;j>=0 && num_Array[j]>temp;j--) { //逐步后移
num_Array[j+1] = num_Array[j];
}
num_Array[j+1] = temp;
}
}
//直接选择排序
public static void selectSort(int[] num_Array) {
for(int i=0;i<num_Array.length;i++) {
int temp = num_Array[i];
//int min = temp; //找到下标
int k=i;
for(int j=i+1;j<num_Array.length;j++) {
if(num_Array[j]<temp) {
k=j;
temp=num_Array[j];
}
}
//num_Array[i]=num_Array[k];
//num_Array[k]=temp; //temp==num_Array[k]
num_Array[k]=num_Array[i];
num_Array[i]=temp;
}
}
public static void qSort(int[] num_Array,int low,int high) {
//无法执行
//if(low<=high) {
if(low>=high) {
return ;
}
int partion = quickSort(num_Array,low,high); //一趟排序
qSort(num_Array,low,partion-1);
qSort(num_Array,partion+1,high);
}
public static int quickSort(int[] num_Array,int low,int high) {
int key=num_Array[low];
int i=low,j=high;
while(i<j) { //一趟排序
while(num_Array[j]>=key && j>i) { //不能“=”,i前面的均小于key
j--;
}
num_Array[i]=num_Array[j];
while(num_Array[i]<=key && i<j) {
i++;
}
num_Array[j]=num_Array[i];
}
//i==j
num_Array[i]=key;
//准备下一趟排序
return i;
}
public static void bubbleSort(int[] num_Array) {
for(int i=0;i<num_Array.length;i++) {
for(int j=1;j<num_Array.length-i;j++) {
if(num_Array[j]<num_Array[j-1]) {
int temp=num_Array[j];
num_Array[j]=num_Array[j-1];
num_Array[j-1]=temp;
}
}
}
}
public static void heapSort(int[] num_Array) {
heap(num_Array,num_Array.length); //大根堆---升序
//最开始建堆 length长度
//选出所有元素的最大值
for(int i=num_Array.length-1;i>0;i--) {
int temp=num_Array[i];
num_Array[i]=num_Array[0];
num_Array[0]=temp;
heap(num_Array,i);
}
}
//数组无序 , 只能找到最大值
public static void heap(int[] num_Array,int size) {
//从最后一个父节点开始调整
int startIndex = size/2-1;
for(int i=startIndex;i>=0;i--) {
maxHeapify(num_Array,i,size);
}
}
//大根堆
public static void maxHeapify(int[] num_Array,int index,int size) {
//左子节点 2*fatherIndex
//右子节点 2*fatherIndex+1 是否存在???
//从0开始 index---index+1---2(index+1)---2(index+1)-1
int leftChildIndex=2*index+1;
int rightChildIndex=2*index+2;
//不能看到子节点大就调换,要选取左右子节点中最大的****
int largest=index;
//*********小于size 而不是小于等于size*******************
if(leftChildIndex<size && num_Array[leftChildIndex]>num_Array[largest]) {
largest=leftChildIndex;
}
if(rightChildIndex<size && num_Array[rightChildIndex]>num_Array[largest]) {
largest=rightChildIndex;
}
//堆发生变化
if(largest!=index) {
int temp=num_Array[index];
num_Array[index]=num_Array[largest];
num_Array[largest]=temp;
//maxHeapify(num_Array,leftChildIndex);
//maxHeapify(num_Array,rightChildIndex);
maxHeapify(num_Array,largest,size);
}
}
}
SORT
最新推荐文章于 2022-06-06 22:18:02 发布