堆排序
来源:互联网 发布:淘宝助理安卓手机版5.7 编辑:程序博客网 时间:2024/06/06 07:38
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();
}
}
1 0
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- 2015-2016 ACM-ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Prefer
- 【最新】中国经济三季度成绩单:九大亮点与你有关↓(为中国点赞)
- Android全面理解Context
- protobuf源码解析
- OpenStack Liberty(第12个版本)
- 堆排序
- Mybatis系列之实战篇(中)
- qcom_vuforia环境搭建
- AFNetworking网络框架的基本使用
- struts2之ModelDriven
- putty字体大小颜色改变
- java关键字之break与continue的区别(简单明了的小例子)
- 重造轮子 用递归函数和栈操作逆序一个栈
- Java中子类是否可以继承父类的static变量和方法而呈现多态特性