八大排序算法之-堆排序 java代码
2017-08-02 22:59
357 查看
import java.util.Arrays; /** * Created by Administrator on 2017/8/2. */ public class heapSort_select { public static void main(String args[]) { int[] arr = { 6, 9, 1, 3, 1, 2, 2, 5, 6, 1, 3, 5, 9, 7, 2, 5, 6, 1, 9 }; //[1, 1, 1, 1, 2, 2, 2, 3, 3, 5, 5, 5, 6, 6, 6, 7, 9, 9, 9] heapSort(arr,0,arr.length-1); System.out.println(Arrays.toString(arr)); } /*算法思想: * 大根堆:根部最大,可用于求最小k个数 * 小根堆:根部最小,可用于求最大k个数 * * 1.首先将序列构建成大根堆 * 2.取出当前最大堆根节点,将其与序列末尾的元素进行交换; * (此时,序列末尾的值已经是最大值) * 3.对交换后的n-1个元素进行调整,使其满足大顶堆的性质 * 4.重复2,3直到堆中只有一个元素为止*/ /*时间复杂度:O(nlogn) * 空间复杂度:*/ private static void heapSort(int[] arr, int start, int end) { /*if (arr==null || arr.length<=1) { }*/ for (int i = 0; i<=end; i++) { heapInsert(arr,arr[i],i); } System.out.println(Arrays.toString(arr)); for (int i = end - 1; i>=0; i--) { swap(arr,0,i+1); selfBalanceHeap(arr,0,i); } } private static void selfBalanceHeap(int[] heap, int index, int end) { int left = index * 2 + 1; int right = index * 2 + 2; int largest = index; while (left<=end) { if ( heap[left]>heap[index]) { largest = left; } if (right<=end && heap[right]>heap[largest]) {//此处应该和heap【largest】进行比较,即最大值,否则会出错 largest = right; } if (index!=largest) { swap(heap,index,largest); }else { break; } index = largest; left = index*2 +1; right = index*2+2; } } private static void heapInsert(int[] heap, int value, int index) { heap[index] = value; while (index!=0) { int parent = (index - 1)/2; if (heap[parent] <heap[index]) { swap(heap,parent,index); index = parent; }else { break; } } } private static void swap(int[] heap, int parent, int index) { int tmp = heap[parent]; heap[parent] = heap[index]; heap[index] = tmp; } }
相关文章推荐
- 深入解析堆排序的算法思想及Java代码的实现演示
- Java实现常见排序--希尔排序、快排序、堆排序、归并排序等Java实现代码
- 【算法与数据结构】冒泡、插入、归并、堆排序、快速排序的Java实现代码
- java 堆排序代码(最小堆)
- Java实现堆排序(Heapsort)实例代码
- java堆排序递归代码,无原理版,比较好理解
- 算法代码实现之堆排序,Java实现
- 八大排序算法之-希尔排序 java代码
- 堆排序JAVA代码
- 选择排序、树形排序、堆排序的java代码实现
- 堆排序原理(图)及java版代码
- 八大排序算法及完整c代码—堆排序c、java代码
- 八大排序算法之-快速排序 java代码
- 排序基础之归并排序、快排、堆排序、希尔排序思路讲解与Java代码实现
- 数据结构--排序系列(插入排序,希尔排序,堆排序)Java代码实现
- 快速排序,归并排序,堆排序的java代码实现
- 八大排序算法之-冒泡排序 java代码
- 堆排序Java代码
- 八大排序算法之-选择排序 java代码
- 冒泡、插入、归并、堆排序、快速排序的Java实现代码