diff --git a/.classpath b/.classpath new file mode 100644 index 0000000000000000000000000000000000000000..f0c32f9c471c976a320131fc6e656064614a136c --- /dev/null +++ b/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000000000000000000000000000000000000..1fe9fc90d489017efa93f80270255fac6a197d6c --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + lec07-heap + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000000000000000000000000000000000000..99f26c0203a7844de00dbfc56e6a35d8ed3c022c --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git "a/\345\237\272\347\241\200\344\275\234\344\270\232/.gitignore" "b/\345\237\272\347\241\200\344\275\234\344\270\232/.gitignore" new file mode 100644 index 0000000000000000000000000000000000000000..7fd76dec8bc60562d54ee2e2ffab6f0e25c75b86 --- /dev/null +++ "b/\345\237\272\347\241\200\344\275\234\344\270\232/.gitignore" @@ -0,0 +1,2 @@ +/Heap.class +/Mian.class diff --git "a/\345\237\272\347\241\200\344\275\234\344\270\232/Heap.class" "b/\345\237\272\347\241\200\344\275\234\344\270\232/Heap.class" new file mode 100644 index 0000000000000000000000000000000000000000..4e4fad222cf699818455ca553964f1d9558c9591 Binary files /dev/null and "b/\345\237\272\347\241\200\344\275\234\344\270\232/Heap.class" differ diff --git "a/\345\237\272\347\241\200\344\275\234\344\270\232/Heap.java" "b/\345\237\272\347\241\200\344\275\234\344\270\232/Heap.java" new file mode 100644 index 0000000000000000000000000000000000000000..9c11512d2101c4598a7d92f422802f2e9cecf5c0 --- /dev/null +++ "b/\345\237\272\347\241\200\344\275\234\344\270\232/Heap.java" @@ -0,0 +1,120 @@ + + +public class Heap{ + private int[] heap; + private int SIZE; + private int count; + + + Heap(int size){ + SIZE = size; + // reference: https://stackoverflow.com/questions/34827626/cannot-be-cast-to-ljava-lang-comparable + heap = new int[SIZE]; + count = 0; + } +//小顶堆的实现 +//入堆函数 + public void add (int item){ + if(count >= SIZE){ + // throw new Exception("Heap Overflow"); + System.out.println("Heap Full");//满了 + return; + } + heap[count] = item; + count++; + shiftUp(heap, count - 1); + + } +//向下调整 + private static void shiftDown(int[] array, int size, int index) { + int parent = index; + int child = parent * 2 + 1; + while (child < size) { + if (child + 1 < size && array[child + 1] < array[child]) { + child = child + 1; + } + if (array[child] < array[parent]) { + swap(array, parent, child); + } else { + break; + } + parent = child; + child = parent * 2 + 1; + } + } + + //向上调整 + private void shiftUp(int[] array, int index) { + int child = index; + int parent = (child - 1) / 2; + while (child > 0) { + if (heap[parent]>heap[child]) { + swap(heap, parent, child); + }else { + break; + } + child = parent; + parent = (child - 1) / 2; + } + } + + //交换 + private static void swap(int[] array, int x, int y) { + int temp = array[x]; + array[x] = array[y]; + array[y] = temp; + } + + +//出堆函数 + public void delete(int item){ + if (count == 0) { + System.out.println("count=0,heap是空的"); + } + for (int i = 0; i < heap.length; i++) { + if (heap[i]==item) { + heap[i]=heap[count-1]; + count--; + shiftDown(heap, count,i); + } + + } + + } + + +//打印堆 + public void print(){ + if (count == 0) { + return ; + } + System.out.println("heap中有这些数据:"); + for (int i = 0; i heap[j]){ +// int temp=heap[i]; +// heap[i]=heap[j]; +// heap[j]=temp; +// } +// } +// } +// +//} +// +// + } diff --git "a/\345\237\272\347\241\200\344\275\234\344\270\232/Mian.class" "b/\345\237\272\347\241\200\344\275\234\344\270\232/Mian.class" new file mode 100644 index 0000000000000000000000000000000000000000..274ea26a872c68344f0d3c8eee9c1df2425b0a82 Binary files /dev/null and "b/\345\237\272\347\241\200\344\275\234\344\270\232/Mian.class" differ diff --git "a/\345\237\272\347\241\200\344\275\234\344\270\232/Mian.java" "b/\345\237\272\347\241\200\344\275\234\344\270\232/Mian.java" new file mode 100644 index 0000000000000000000000000000000000000000..8eb4fddbd73af01ea70b252e498719e8b0f9101c --- /dev/null +++ "b/\345\237\272\347\241\200\344\275\234\344\270\232/Mian.java" @@ -0,0 +1,21 @@ + +public class Mian { + + public static void main(String[] args) { + // TODO 自动生成的方法存根 + Heap aa = new Heap(10); + aa.add(5); + aa.add(3); + aa.add(9); + aa.add(6); + aa.add(15); + aa.add(4); + aa.add(11); + aa.add(16); + aa.print(); + aa.delete(5); + aa.print(); + + } + +} diff --git "a/\345\237\272\347\241\200\344\275\234\344\270\232/\345\244\247\351\241\266\345\240\206/.gitignore" "b/\345\237\272\347\241\200\344\275\234\344\270\232/\345\244\247\351\241\266\345\240\206/.gitignore" new file mode 100644 index 0000000000000000000000000000000000000000..7fd76dec8bc60562d54ee2e2ffab6f0e25c75b86 --- /dev/null +++ "b/\345\237\272\347\241\200\344\275\234\344\270\232/\345\244\247\351\241\266\345\240\206/.gitignore" @@ -0,0 +1,2 @@ +/Heap.class +/Mian.class diff --git "a/\345\237\272\347\241\200\344\275\234\344\270\232/\345\244\247\351\241\266\345\240\206/Heap.java" "b/\345\237\272\347\241\200\344\275\234\344\270\232/\345\244\247\351\241\266\345\240\206/Heap.java" new file mode 100644 index 0000000000000000000000000000000000000000..0586ce0f6549f3a6010da0f6fde1b1e657bbaff6 --- /dev/null +++ "b/\345\237\272\347\241\200\344\275\234\344\270\232/\345\244\247\351\241\266\345\240\206/Heap.java" @@ -0,0 +1,121 @@ +package 大顶堆; + + +public class Heap{ + private int[] heap; + private int SIZE; + private int count; + + + Heap(int size){ + SIZE = size; + // reference: https://stackoverflow.com/questions/34827626/cannot-be-cast-to-ljava-lang-comparable + heap = new int[SIZE]; + count = 0; + } +//大顶堆的实现 +//入堆函数 + public void add (int item){ + if(count >= SIZE){ + // throw new Exception("Heap Overflow"); + System.out.println("Heap Full");//满了 + return; + } + heap[count] = item; + count++; + shiftUp(heap, count - 1); + + } +//向下调整 + private static void shiftDown(int[] array, int size, int index) { + int parent = index; + int child = parent * 2 + 1; + while (child < size) { + if (child + 1 < size && array[child + 1] > array[child]) { + child = child + 1; + } + if (array[child] > array[parent]) { + swap(array, parent, child); + } else { + break; + } + parent = child; + child = parent * 2 + 1; + } + } + + //向上调整 + private void shiftUp(int[] array, int index) { + int child = index; + int parent = (child - 1) / 2; + while (child > 0) { + if (heap[parent]>heap[child]) { + swap(heap, parent, child); + }else { + break; + } + child = parent; + parent = (child - 1) / 2; + } + } + + //交换 + private static void swap(int[] array, int x, int y) { + int temp = array[x]; + array[x] = array[y]; + array[y] = temp; + } + + +//出堆函数 + public void delete(int item){ + if (count == 0) { + System.out.println("count=0,heap是空的"); + } + for (int i = 0; i < heap.length; i++) { + if (heap[i]==item) { + heap[i]=heap[count-1]; + count--; + shiftDown(heap, count,0); + } + + } + + } + + +//打印堆 + public void print(){ + if (count == 0) { + return ; + } + System.out.println("heap中有这些数据:"); + for (int i = 0; i heap[j]){ +// int temp=heap[i]; +// heap[i]=heap[j]; +// heap[j]=temp; +// } +// } +// } +// +//} +// +// + } diff --git "a/\345\237\272\347\241\200\344\275\234\344\270\232/\345\244\247\351\241\266\345\240\206/Mian.java" "b/\345\237\272\347\241\200\344\275\234\344\270\232/\345\244\247\351\241\266\345\240\206/Mian.java" new file mode 100644 index 0000000000000000000000000000000000000000..4ecb71463385187d9882985f35e7d147c09fab34 --- /dev/null +++ "b/\345\237\272\347\241\200\344\275\234\344\270\232/\345\244\247\351\241\266\345\240\206/Mian.java" @@ -0,0 +1,26 @@ +package 大顶堆; + +public class Mian { + + public static void main(String[] args) { + // TODO 自动生成的方法存根 + Heap aa = new Heap(10); + aa.add(5); + aa.add(3); + aa.add(9); + aa.add(6); + aa.add(15); + aa.add(4); + aa.add(11); + aa.add(16); + aa.print(); + aa.delete(16); + aa.print(); + aa.delete(15); + aa.print(); + aa.delete(11); + aa.print(); + + } + +} diff --git "a/\350\277\233\351\230\266\344\275\234\344\270\232/MergeK.class" "b/\350\277\233\351\230\266\344\275\234\344\270\232/MergeK.class" new file mode 100644 index 0000000000000000000000000000000000000000..c44b5a92923ea91223bedf9c22af300e81fc7f93 Binary files /dev/null and "b/\350\277\233\351\230\266\344\275\234\344\270\232/MergeK.class" differ diff --git "a/\350\277\233\351\230\266\344\275\234\344\270\232/MergeK.java" "b/\350\277\233\351\230\266\344\275\234\344\270\232/MergeK.java" new file mode 100644 index 0000000000000000000000000000000000000000..09d3c16b6a1e0fcfe35cb4366b866d42426658cc --- /dev/null +++ "b/\350\277\233\351\230\266\344\275\234\344\270\232/MergeK.java" @@ -0,0 +1,68 @@ +package 进阶作业; + +import java.util.Arrays; + +/** + 合并K个有序数组 + */ +public class MergeK { + + public static int[] merge(int[] arr1, int[] arr2){ + int length1 = arr1.length; + int length2 = arr2.length; + + int[] arr = new int[length1 + length2]; + int j = 0; + int k = 0; + int i = 0; + while (j < length1 && k < length2){ + if (arr1[j] <= arr2[k]){ + arr[i] = arr1[j]; + i++; + j++; + }else { + arr[i] = arr2[k]; + i++; + k++; + } + } + + //把还没有进行合并的元素直接添加到新数组的后面,可能出现一个数组有剩,另一个数组合并完毕 + while (j < length1){ + arr[i] = arr1[j]; + i++; + j++; + } + while (k < length2){ + arr[i] = arr2[k]; + i++; + k++; + } + + return arr; + } + //2.求⼀组动态数据集合的最⼤Top K + public static void topK(int[] merge,int k) { + int[] toparr = new int[k]; + for (int i = 0; i < k; i++) { + toparr[i]=merge[i]; + + } + System.out.println(Arrays.toString(toparr)); + + } +//测试 + public static void main(String[] args) { + int[] arr1 = {1,3,5,6}; + int[] arr2 = {1,2,5,7}; + int[] arr3 = {3,6,9,11}; + int[] arr4 = {5,7,13,17}; + + int[] merge1 = merge(arr1, arr2); + int[] merge2 = merge(arr3, arr4); + int[] merge = merge(merge1, merge2); + System.out.println(Arrays.toString(merge)); + System.out.println("执行topK:"); + MergeK.topK(merge, 5); + } +} \ No newline at end of file