/** * 堆排序 * * @param array * @param length */public void heapSort(int[] array, int length) {// 调整为大根堆的形式// 存储根堆的元素个数int currentSize = length;int start = (currentSize - 2) >>> 1;while (start >= 0) {siftDown(array, start, currentSize - 1);start--;}int end = array.length - 1;while (end > 0) {swap(array, 0, end);end--;siftDown(array, 0, end);}}原文:http://my.oschina.net/ysh3940/...
堆排序思想:堆排序,顾名思义,就是基于堆。堆分为最大堆和最小堆,其实就是完全二叉树。最大堆要求节点的元素都要大于其孩子,最小堆要求节点元素都小于其左右孩子,两者对左右孩子的大小关系不做任何要求,其实很好理解。有了上面的定义,我们可以得知,处于最大堆的根节点的元素一定是这个堆中的最大值。其实我们的堆排序算法就是抓住了堆的这一特点,每次都取堆顶的元素,将其放在序列最后面,然后将剩余的元素重新调整为最大...
选择排序思想:每趟从待排序的记录序列中选择关键字最小的记录放置到已排序表的最前位置,直到全部排完。关键问题:在剩余的待排序记录序列中找到最小关键码记录。方法:–直接选择排序–堆排序
(1)简单的选择排序1、基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。2、实例
实现代码: public static void...
选择排序的基本思想每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,知道所有记录排序完毕。主要有两种选择排序方法:直接选择排序(或称简单选择排序)和堆排序。直接选择排序基本思想第i趟排序開始时,当前有序区和无序区分别为R[1 …… i-1]和R[i …… n](1 <= i <= n-1),该趟排序则是从当前无序区中选出关键字最小的记录R[k],将它与无序区的第一个记录R[i]交换,使R[1 …… i]和R[i+1 …… n]分...
1publicclass HeapSort {2publicstaticvoid main(String[] args) {3int[] a = newint[]{6, 2, 8, 3, 5, 1, 8, 6, 54, 64, -1, 2, 4, 4, 67};4 heapSort(a);5 System.out.println();6 }7 8staticvoid heapSort(int[] a) {9int bounds = a.length;
10for (int i = bounds - 1; i >= 0; i--) maxHeap(i, bounds, a);
11while (bounds > 0) {
12int t = a[0];
13 a[0] = a[bounds - 1];
14 a...
[算法说明]堆排序是对简单选择排序的改进简单选择排序是从n个记录中找出一个最小的记录,需要比较n-1次。但是这样的操作并没有把每一趟的比较结果保存下来,在后一趟的比较中,有许多比较在前一趟已经做过了,但由于前一趟排序时未保存这些比较结果,所以后一趟排序时又重复执行了这些比较操作,因而记录的比较次数较多。堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值...
package org.rev.algorithm;/**
* 堆排序,时间复杂度为O(nlogn),是利用堆的性质进行的一种选择排序。
*
* 大顶堆是一个完全二叉树,所有的父节点都大于或等于它的左右子节点,即a[i]>=a[2i+1]&&a[i]>=a[2i+2]。
*(小顶堆是父节点<=子节点)
*
* 对于完全二叉树,任意节点a[i]的父节点的索引值是(i-1) / 2 向下取整。
*
* 1.对于序列a[0]-a[n-1],构建大顶堆,堆顶a[0]为最大值。
*
* 2. 交换堆顶a[0]和最后一个元素...
package com.peter.app.hello.heapsort;
/**
* heap sort
* @author Peter.Yu
*
*/
public class HeapSort {
public static int COUNT = 0;
/**
* build heap
* @param a
* @param size
*/
public static void buildHeap(int[] a, int size) {
for (int i = size / 2; i >= 1; i--) {
adjustHeap(a, i, size);
}
}
/**
* adjust heap
* @param...
$arr = array( 12, 45, 89, 3, 24, 55, 223, 76, 22, 11, 28, 112, 20, 434, 23, 65, 65, 765, 6, 8, 23, 5, 33, 553, 45, 423, 64, 77, 84, 23);/** * 冒泡排序算法,时间复杂度n2/2次 * 冒泡排 序的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。 * 然后比...
查找与排序(一) 查找与排序(二)
二叉树的遍历
import java.util.Scanner;public class LianXi {//前序遍历public static void preOrder(int []arr, int i){if(i >= arr.length)return;System.out.print(arr[i] + " "); //输出根节点preOrder(arr, 2 * i + 1); //递归输出左子树preOrder(arr, 2 * i + 2); //递归输出右子树}//中序遍历public static void inOrder(int []arr, int i){if(i >= arr.length)return;inOr...
堆
堆基本介绍
堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,最坏,最好,平均时间复杂度都是O(nlogn),不稳定的排序
堆是具有以下性质的完全二叉树:每个节点的值都大于或等于其左右孩子节点的值称为大顶堆
小于或等于左右孩子节点的值称为小顶堆
堆排序
基本思想
将待排序的序列构造成一个大顶堆(数组)
此时 ,整个序列的最大值就是堆顶的根节点
将其与末尾元素进行交换,此时末尾为最大值
然后将...
冒泡排序
依次比较相邻的元素,若发现逆顺序,则交换。小的向前换,大的向后换,本次循环完毕之后再次从头开始扫描,直到某次扫描中没有元素交换,说明每个元素都不比它后面的元素大,至此排序完成。
import java.util.Arrays;
public class BubbleSort {public static void main(String[] args) {int[] arr=new int[] {5,7,2,9,4,1,0,5,7};System.out.println(Arrays.toString(arr));bubbleSort(arr);System.out.println(Arrays.t...
基本算法-堆排序及其Java实现 (二叉)堆(heap)数据结构是一种数组对象,可以视作一颗完全二叉树,从该二叉树的根开始层次遍历这颗二叉树就可以得到其对应的数组。树的根节点为A[0],对于树中某个节点的坐标i,其左右孩子节点和父亲节点的坐标可以很方便的求得:
LEFT(i)=2*i+1; RIGHT(i)=2*i+2; PARENT(i)=i/2 .
有两种二叉堆:最大堆和最小堆。最大堆中,每个节点存储的数值都大于等于其左右两个孩子节点存储的数值,亦即A[i]...
1.堆
堆,其实是一个完全二叉树,分为大顶堆和小顶堆。
大顶堆:每个节点的值都大于或者等于其左右子节点的值
小顶堆:每个节点的值都小于或者等于其左右子节点的值
注意:堆中某个节点的左右子节点的值的大小关系没有要求,即左子节点的值可以大于、可以等于、也可以小于右子节点的值。
升序采用大顶堆、降序采用小顶堆。
2.堆排序
首先将 n 个元素的待排序序列构建成一个大顶堆,这样待排序序列的第一个元素(即大顶堆的根节点)就...
二叉堆/堆排序概念理解以及Java语言实现(学习笔记)
1.基础概念介绍
(1)满二叉树:每一层都达到了最大节点数,高度为h的满二叉树节点数为pow(2,h)-1 ( pow(x,y)代表x^y )
如图所示:(2)完全二叉树:高度为h的二叉树每一个节点都和高度为h的满二叉树节点编号一一对应,那么它就是满二叉树。
如图所示:[1] 高度为h的完全二叉树节点数取值范围[pow(2,h-1),pow(2,h)-1],可见完全二叉树的高度是O( log(n) )[2] 满二叉树是特殊的完...