package com.lewis.datastruct_algorithm.sort.heap;
import com.lewis.datastruct_algorithm.util.RandomUtil;
import java.util.Arrays;
/**
* 最大索引堆 下标从0开始
* parent 索引 = (i-1)/2
* leftChild索引 = 2*i +1
* rightChild索引 = 2*i +2
* @author zmh46712
* @version Id: MaxIndexHeap, v 0.1 2017/5/31 10:02 zmh46712 Exp $
*/
public class MaxIndexHeap<T extends Comparable> {
/**
* 最大索引堆中的数据
*/
protected T[] data;
/**
* 最大索引堆中的索引:indexes[x] = i 表示索引i在x的位置
*/
private int[] indexes;
/**
* 最大索引堆中的反向索引:reverseIndexes[i] = x 表示索引i在x的位置
*/
private int[] reverseIndexes;
protected int count;
protected int capacity;
public MaxIndexHeap(int capacity) {
this.data = (T[]) new Comparable[capacity];
this.count = 0;
this.capacity = capacity;
this.indexes = new int[capacity];
this.reverseIndexes = new int[capacity];
for (int i = 0; i < capacity; i++) {
reverseIndexes[i] = 0;
}
}
public int size() {
return count;
}
public boolean isEmpty() {
return count == 0;
}
public void insert(int i, T item) {
assert (count + 1 <= capacity);
assert (i >= 0 && i <= capacity);
data[i] = item;
indexes[count] = i;
reverseIndexes[i] = count;
shiftUp(count);
count++;
}
/**
* 获取最大值
*/
public T extractMax() {
assert (count > 0);
T ret = data[indexes[0]];
swap(indexes, 0, count - 1);
reverseIndexes[indexes[count - 1]] = 0;
count--;
shiftDown(0);
return ret;
}
/**
* 获取最大值的索引
*/
public int extractMaxIndex() {
assert (count > 0);
int ret = indexes[0];
swap(indexes, 0, count - 1);
count--;
shiftDown(0);
return ret;
}
/**
* 将最大索引堆中索引为i的元素修改为newData
*/
public void set(int i, T newData) {
assert (i >= 0 && i <= capacity);
data[i] = newData;
for (int j = 0; j < count; j++) {
if (indexes[j] == i) {
shiftUp(j);
shiftDown(j);
return;
}
}
}
/**
* 注意此下标从0开始的,所以条件为 2*k+1 <count,非<=
*/
private void shiftDown(int k) {
while (2 * k + 1 < count) {
int j = 2 * k + 1;
if (j + 1 < count && data[indexes[j + 1]].compareTo(data[indexes[j]]) > 0) {
j++;
}
if (data[indexes[k]].compareTo(data[indexes[j]]) >= 0) {
break;
}
swap(indexes, k, j);
reverseIndexes[indexes[k]] = k;
reverseIndexes[indexes[j]] = j;
k = j;
}
}
private void shiftUp(int k) {
while (k > 0 && greaterParent(k)) {
swap(indexes, k, (k - 1) / 2);
reverseIndexes[indexes[k]] = k;
reverseIndexes[indexes[(k - 1) / 2]] = (k - 1) / 2;
k = (k - 1) / 2;
}
}
private boolean greaterParent(int k) {
return data[indexes[k]].compareTo(data[indexes[(k - 1) / 2]]) > 0;
}
private void swap(int[] array, int idx, int idy) {
int tmp = array[idx];
array[idx] = array[idy];
array[idy] = tmp;
}
public static void main(String[] args) {
Integer[] array = RandomUtil.generateRandomArray(20, 0, 100);
MaxIndexHeap maxIndexHeap = new MaxIndexHeap(20);
for (int i = 0; i < array.length; i++) {
maxIndexHeap.insert(i, array[i]);
}
System.out.println(Arrays.toString(maxIndexHeap.data));
for (int i = 0; i < array.length; i++) {
System.out.print(maxIndexHeap.extractMax() + " ");
}
System.out.println("=================");
System.out.println("=================");
Integer[] array1 = RandomUtil.copyArray(array);
maxIndexHeap = new MaxIndexHeap(20);
for (int i = 0; i < array.length; i++) {
maxIndexHeap.insert(i, array1[i]);
}
System.out.println(Arrays.toString(maxIndexHeap.data));
for (int i = 0; i < array.length; i++) {
System.out.print(maxIndexHeap.extractMaxIndex() + " ");
}
System.out.println();
for (int i = 0; i < array.length; i++) {
System.out.print(i + " ");
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
数据结构-算法.zip
共36个文件
java:25个
xml:10个
iml:1个
需积分: 2 0 下载量 16 浏览量
2024-01-14
12:41:25
上传
评论
收藏 34KB ZIP 举报
温馨提示
算法与数据结构它们分别涵盖了以下主要内容: 数据结构(Data Structures): 逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何具体存储。例如,数组的连续存储,链表的动态分配节点,树和图的邻接矩阵或邻接表表示等。 基本操作:针对每种数据结构,定义了一系列基本的操作,包括但不限于插入、删除、查找、更新、遍历等,并分析这些操作的时间复杂度和空间复杂度。 算法: 算法设计:研究如何将解决问题的步骤形式化为一系列指令,使得计算机可以执行以求解问题。 算法特性:包括输入、输出、有穷性、确定性和可行性。即一个有效的算法必须能在有限步骤内结束,并且对于给定的输入产生唯一的确定输出。 算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法,分支限界法等。 算法分析:通过数学方法分析算法的时间复杂度(运行时间随数据规模增长的速度)和空间复杂度(所需内存大小)来评估其效率。 学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。
资源推荐
资源详情
资源评论
收起资源包目录
数据结构-算法.zip (36个子文件)
open_suanfayushujujiegouxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcxxxxxxxxxxxxcxvcvcv
pom.xml 771B
datastruct-algorithm.iml 12KB
src
test
java
com
lewis
AppTest.java 637B
main
java
com
lewis
datastruct_algorithm
sort
SortOptimize.java 1KB
heap
MaxHeap.java 2KB
MaxIndexHeap.java 5KB
Sort.java 228B
factory
SortFactory.java 2KB
MyException.java 256B
SortEnum.java 405B
Test.java 2KB
strategy
InsertSort.java 868B
SelectionSort.java 776B
advanced
HeapSort.java 1KB
QuickSort3Ways.java 1KB
QuickSort2Ways.java 2KB
QuickSort.java 2KB
HeapSortAdvance.java 638B
HeapSort1.java 753B
MergeSort.java 2KB
InsertSortAdvanced.java 719B
ShellSort.java 331B
BubbleSort.java 334B
test
SortOptimizeTest.java 664B
util
SortTestUtil.java 1KB
RandomUtil.java 2KB
PrintableMaxHeap.java 4KB
.idea
uiDesigner.xml 9KB
libraries
Maven__junit_junit_3_8_1.xml 450B
vcs.xml 167B
misc.xml 1KB
compiler.xml 1KB
findbugs-idea.xml 12KB
modules.xml 280B
encodings.xml 215B
copyright
profiles_settings.xml 74B
共 36 条
- 1
资源评论
极致人生-010
- 粉丝: 2930
- 资源: 2826
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功