堆排序和其他排序算法时间复杂度比较截图
堆排序执行(完整代码)
MaxHeap.java(最大堆数据结构)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
public class MaxHeap <E extends Comparable <E >> { private Array<E> data; public MaxHeap (int capacity) { data = new Array<>(capacity); } public MaxHeap () { data = new Array<>(); } public int size () { return data.getSize(); } public boolean isEmpty () { return data.isEmpty(); } private int parent (int index ) { if (index == 0 ) throw new IllegalArgumentException("index-0 doesn't have parent." ); return (index - 1 ) / 2 ; } private int leftChild (int index) { return index * 2 + 1 ; } private int rightchild (int index) { return index * 2 + 2 ; } public void add (E e) { data.addLast(e); siftUp(data.getSize()- 1 ); } private void siftUp (int k) { while (k > 0 && data.get(parent(k)).compareTo(data.get(k)) < 0 ){ data.swap(k , parent(k)); k = parent(k); } } public E findMax () { if (data.getSize()==0 ) throw new IllegalArgumentException("can not findMax when heap is empty!" ); return data.get(0 ); } public E extractMax () { E ret = findMax(); data.swap(0 , data.getSize()-1 ); data.removeLast(); siftDown(0 ); return ret; } private void siftDown (int k ) { while (leftChild(k) < data.getSize() ){ int j = leftChild(k); if (j + 1 < data.getSize() && data.get(j+1 ).compareTo(data.get(j))>0 ){ j = rightchild(k); } if (data.get(k).compareTo(data.get(j)) >= 0 ) break ; data.swap(k,j); k = j; } } }
Array.java(堆使用的自定义动态数组)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
public class Array <E > { private E[] data; private int size; public Array (int capacity) { data =(E[])new Object[capacity]; size = 0 ; } public Array () { this (10 ); } public int getSize () { return size; } public int getCapacity () { return data.length; } public boolean isEmpty () { return size == 0 ; } public void addLast (E e) { add(size, e); } public void addFirst (E e) { add(0 , e); } public void add (int index, E e) { if (index < 0 || index > size ){ throw new IllegalArgumentException("Add failed. Require index >=0 and index <= size." ); } if (size == data.length) { resize(2 * data.length); } for (int i = size - 1 ; i >= index ; i --){ data[i + 1 ]=data[i]; } data[index] = e; size ++; } public E get (int index) { if (index < 0 || index >= size) throw new IllegalArgumentException("Get failed. Index is illegal." ); return data[index]; } public void set (int index, E e) { if (index < 0 || index >= size) throw new IllegalArgumentException("set failed. Index is illegal." ); data[index] = e; } public boolean contains (E e) { for (int i = 0 ; i < size ; i++) { if (data[i].equals(e)) return true ; } return false ; } public int find (E e) { for (int i = 0 ; i < size ; i++) { if (data[i].equals(e)) return i; } return -1 ; } public E remove (int index) { if (index < 0 || index >= size) { throw new IllegalArgumentException("Remove failed. Index is illegal." ); } E ret = data[index]; for (int i = index + 1 ; i < size ; i ++) { data[i-1 ] = data[i]; } size --; data[size] = null ; if (size == data.length / 4 && data.length / 2 != 0 ) resize(data.length / 2 ); return ret; } public E removeFirst () { return remove(0 ); } public E removeLast () { return remove(size-1 ); } public void removeElement (E e) { int index = find(e); if (index != -1 ) remove(index); } public void swap (int i , int j) { if (i < 0 || i >= size || j < 0 || j >= size) throw new IllegalArgumentException("Index is illegal." ); E t = data[i]; data[i] = data[j]; data[j] = t; } @Override public String toString () { StringBuilder res = new StringBuilder(); res.append(String.format("Array: size = %d, capacity = %d \n" , size, data.length)); res.append('[' ); for (int i = 0 ; i < size ; i ++){ res.append(data[i]); if (i != size - 1 ) res.append(", " ); } res.append(']' ); return res.toString(); } private void resize (int newCapacity) { E[] newData = (E[])new Object[newCapacity]; for (int i = 0 ; i < size ; i ++) newData[i] = data[i]; data = newData; } }
SortingHelper.java(辅助进行算法时间输出的)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
public class SortingHelper { private SortingHelper () {} public static <E extends Comparable<E>> boolean isSorted (E[] arr) { for (int i = 1 ; i< arr.length; i++) if (arr[i - 1 ].compareTo(arr[i]) > 0 ) return false ; return true ; } public static <E extends Comparable<E>> void sortTest (String sortname, E[] arr) { long startTime = System.nanoTime(); if (sortname.equals("SelectionSort" )) { SelectionSort.sort(arr); } else if (sortname.equals("InsertionSort" )) InsertionSort.sort(arr); else if (sortname.equals("InsertionSort2" )) InsertionSort.sort2(arr); else if (sortname.equals("MergeSort" )) MergeSort.sort(arr); else if (sortname.equals("MergeSort2" )) MergeSort.sort2(arr); else if (sortname.equals("MergeSort3" )) MergeSort.sort3(arr); else if (sortname.equals("MergeSort4" )) MergeSort.sort4(arr); else if (sortname.equals("MergeSortBU" )) MergeSort.sortBU(arr); else if (sortname.equals("QuickSort" )) QuickSort.sort(arr); else if (sortname.equals("QuickSort2" )) QuickSort.sort2ways(arr); else if (sortname.equals("QuickSort3" )) QuickSort.sort3ways(arr); else if (sortname.equals("HeapSort" )) HeapSort.sort(arr); long endTime = System.nanoTime(); double time = (endTime - startTime) / 1000000000.0 ; if (!SortingHelper.isSorted(arr)) throw new RuntimeException(sortname + "failed" ); System.out.println(String.format("%s , n = %d : %f s " , sortname, arr.length, time)); } }
ArrayGenerator.java(生成随机的一组数组或有序的一组数组)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
import java.util.Random;public class ArrayGenerator { private ArrayGenerator () {} public static Integer[] generateOrderedArray(int n){ Integer[] arr = new Integer[n]; for (int i = 0 ; i < n ; i++) arr[i] = i; return arr; } public static Integer[] generateRandomArray(int n, int bound){ Integer[] arr = new Integer[n]; Random rnd = new Random(); for (int i = 0 ; i < n; i++) arr[i] = rnd.nextInt(bound); return arr; } }
HeapSort.java(简单的堆排序)
因为是最大堆,所以进行了逆置输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
import java.util.Arrays;public class HeapSort { private HeapSort () {} public static <E extends Comparable<E>> void sort (E[] data) { MaxHeap<E> maxHeap = new MaxHeap<>(); for (E e: data) maxHeap.add(e); for (int i = data.length - 1 ; i >= 0 ; i --) data[i] = maxHeap.extractMax(); } public static void main (String[] args) { int n = 1000000 ; Integer[] arr = ArrayGenerator.generateRandomArray(n , n); Integer[] arr2 = Arrays.copyOf(arr, arr.length); Integer[] arr3 = Arrays.copyOf(arr, arr.length); Integer[] arr4 = Arrays.copyOf(arr, arr.length); Integer[] arr5 = Arrays.copyOf(arr, arr.length); sort(arr5); for (int i = 0 ; i < n ; i ++){ System.out.println(arr5[i]); } SortingHelper.sortTest("MergeSort" , arr); SortingHelper.sortTest("QuickSort2" , arr2); SortingHelper.sortTest("QuickSort3" , arr3); SortingHelper.sortTest("HeapSort" , arr4); } }
我的个人博客
FROM:gylq.gitee Author:孤桜懶契
免责声明: 文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
点赞
https://cn-sec.com/archives/729949.html
复制链接
复制链接
左青龙
微信扫一扫
右白虎
微信扫一扫
评论