堆排序
2015-10-19 19:43
323 查看
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();
}
}
相关文章推荐
- 2015-2016 ACM-ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Prefer
- 神经网络简史
- P1000 A+B Problem
- MyEclipse利用自定义模板生成hibernate的dao或实体
- UI20_数据库
- iOS 视图控件颜色渲染
- 关于Comparable接口的使用
- add,iterator,toString三个方法实现
- mysql 视图
- 一些程序OEP入口特征
- android中操纵sqlite数据库
- BZOJ2705: [SDOI2012]Longge的问题
- java基础学习笔记——集合框架
- sort函数的cmp函数怎么写?
- C语言中的break、continue和goto三者的区别与用法
- HDU 2577 DP
- C-基本语法与运算
- spring-session实例
- 从软件工程视角,回顾分析本科毕业设计软件中存在的不足问题
- Linux下抓包工具tcpdump以及分析包的工具wireshark