import java.util.Scanner;
/**
*堆排序
*堆积排序是指利用堆积树(堆)这种资料结构所设计的一种排序算法,可以利用数组特点快速定位指定索引
*的元素,坏时间复杂度为O(nlog2n)
* @author Administrator
*
*/
public class sort02 {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
System.out.println("请输入数组以空格分开:");
String str = scanner.nextLine();
String[] data = str.trim().split("\\s{1,}");//trim 去掉字符串开头和结尾的空格 split \s表示空格 表示用1个以上的空格分割
int []a = new int[data.length];
for(int i=0;i<data.length;i++){
a[i] =Integer.parseInt(data[i]);
}
print(a);
heapsort(a);
System.out.println("排序后的数组: ");
print(a);
}
public static void heapsort(int[]data){
for(int i=0;i<data.length;i++){
createMaxHeap(data,data.length-1-i);
int temp = data[0];
data[0] = data[data.length-1-i];
data[data.length-1-i] = temp;
print(data);
}
}
public static void createMaxHeap(int[] data,int lastIndex){
for(int i=(lastIndex-1)/2;i>=0;i--){
//保存当前正在判断的节点
int k = i;
//若当前节点的子节点存在
while(2*k+1<=lastIndex){
//biggerIndex总是记录较大节点的值,先赋值为当前判断节点的左子节点
int biggerIndex = 2*k+1;
if(biggerIndex<lastIndex){
//若右子节点存在,否则此时biggerIndex应该等于lastIndex
if(data[biggerIndex]<data[biggerIndex+1]){
//若右子节点值比左子结点值大,则biggerIndex记录的是右子节点的值
biggerIndex++;
}
}
if(data[k]<data[biggerIndex]){
//若当前节点值比子节点最大值小,则交换两者的值,交换后将biggerIndex值赋值给k
int temp = data[k];
data[k] = data[biggerIndex];
data[biggerIndex] = temp;
k = biggerIndex;
}
else{
break;
}
}
}
}
public static void print(int[] data){
for(int i=0;i<data.length;i++){
System.out.print(data[i]+"\t");
}
System.out.println();
}
}
/**
*堆排序
*堆积排序是指利用堆积树(堆)这种资料结构所设计的一种排序算法,可以利用数组特点快速定位指定索引
*的元素,坏时间复杂度为O(nlog2n)
* @author Administrator
*
*/
public class sort02 {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
System.out.println("请输入数组以空格分开:");
String str = scanner.nextLine();
String[] data = str.trim().split("\\s{1,}");//trim 去掉字符串开头和结尾的空格 split \s表示空格 表示用1个以上的空格分割
int []a = new int[data.length];
for(int i=0;i<data.length;i++){
a[i] =Integer.parseInt(data[i]);
}
print(a);
heapsort(a);
System.out.println("排序后的数组: ");
print(a);
}
public static void heapsort(int[]data){
for(int i=0;i<data.length;i++){
createMaxHeap(data,data.length-1-i);
int temp = data[0];
data[0] = data[data.length-1-i];
data[data.length-1-i] = temp;
print(data);
}
}
public static void createMaxHeap(int[] data,int lastIndex){
for(int i=(lastIndex-1)/2;i>=0;i--){
//保存当前正在判断的节点
int k = i;
//若当前节点的子节点存在
while(2*k+1<=lastIndex){
//biggerIndex总是记录较大节点的值,先赋值为当前判断节点的左子节点
int biggerIndex = 2*k+1;
if(biggerIndex<lastIndex){
//若右子节点存在,否则此时biggerIndex应该等于lastIndex
if(data[biggerIndex]<data[biggerIndex+1]){
//若右子节点值比左子结点值大,则biggerIndex记录的是右子节点的值
biggerIndex++;
}
}
if(data[k]<data[biggerIndex]){
//若当前节点值比子节点最大值小,则交换两者的值,交换后将biggerIndex值赋值给k
int temp = data[k];
data[k] = data[biggerIndex];
data[biggerIndex] = temp;
k = biggerIndex;
}
else{
break;
}
}
}
}
public static void print(int[] data){
for(int i=0;i<data.length;i++){
System.out.print(data[i]+"\t");
}
System.out.println();
}
}