【数据结构与算法】堆排序

堆排序的时间复杂度是O(nlogn),下面上代码

public class HeapSort {

	public void adjustHeap(int[] in, int index, int length) {
		int leftcIndex = index * 2 + 1;
		int rightcIndex = index * 2 + 2;
		int bigest = index;
		while (leftcIndex < length || rightcIndex < length) {
			if (leftcIndex < length && in[leftcIndex] > in[bigest]) {
				bigest = leftcIndex;
			}
			if (rightcIndex < length && in[rightcIndex] > in[bigest]) {
				bigest = rightcIndex;
			}
			if (index == bigest) {
				break;
			} else {
				int sum = in[index] + in[bigest];
				in[bigest] = sum - in[bigest];
				in[index] = sum - in[bigest];
				index = bigest;
				leftcIndex = index * 2 + 1;
				rightcIndex = index * 2 + 2;
			}
		}
	}

	public void createHeap(int[] in) {
		int length = in.length;
		for (int i = length / 2; i >= 0; i--) {
			adjustHeap(in, i, length);
			printArray(in);
		}
	}

	public void printArray(int[] in) {
		for (int i : in) {
			System.out.print(i + " ");
		}
		System.out.println();
	}

	public static void main(String[] args) {
		HeapSort heapSort = new HeapSort();
		int[] testCase = { 1, 3, 4, 2, 10, 11, 45, 6 };
		heapSort.createHeap(testCase);
		int length = testCase.length;
		while (length > 1) {
			int sum = testCase[0] + testCase[length - 1];
			testCase[0] = sum - testCase[0];
			testCase[length - 1] = sum - testCase[0];
			heapSort.adjustHeap(testCase, 0, --length);
		}
		System.out.println("#########################");
		heapSort.printArray(testCase);
	}
}

【数据结构与算法】堆排序

时间: 2024-10-03 23:56:06

【数据结构与算法】堆排序的相关文章

数据结构与算法——堆排序

代码: void HeapSort(int a[], int n){    int Tmp;    for (int i = n / 2; i >= 0; i--)        PercDown(a, i, n);    /*build a heap; we should know that intinially we put all of the  elements randomly, then    we begin to percolate down the heap from the

数据结构和算法-堆排序

1 维护最大堆性质的过程(MAX-HEAPIFY) 输入数组A和一个下标i.假设以LEFT(i)和RIGHT(i)为根节点二叉树都是最大堆,但是A[i]可能小于左右孩子节点.这时需要通过该过程使得A[i]在最大堆中“逐级下降”,从而使得以下标i为根节点二叉树为最大堆. 伪代码 : MAX-HEAPIFY(A , i) L = LEFT(i) = 2i ; R = RIGHT(i) = 2i+1; if(L <= A.heap-size and A[L] > A[i]) { largest =

java数据结构和算法------堆排序

1 package iYou.neugle.sort; 2 3 public class Heap_sort { 4 public static void HeapSort(double[] array) { 5 for (int i = (int) Math.floor(array.length / 2); i > 0; i--) { 6 HeapBuild(array, i, array.length); 7 } 8 9 for (int i = array.length - 1; i >

【算法与数据结构】图说堆排序

1.堆   一棵完全二叉树 大顶堆:所有非叶子节点元素均不小于其左右子树根节点的值 小顶堆:所有非叶子节点元素均不大于其左右子树根节点的值 2. 初始化堆 ①一组无序元素R[0, 1, ..., n - 1], 先按照顺序将该组无序元素构造为一棵完全二叉树 ②从该二叉树的第一个非叶子结点开始调整,然后调整前一个结点(一定是非叶子结点),依次直到调整完根节点 ③上一步一遍完成后,再来一遍,直到该完全二叉树符合一个堆的定义为止 测试数据:R[] = {16, 7, 3, 20, 17, 8}, 本组

【数据结构和算法16】堆排序

堆排序,顾名思义就是利用堆这个数据结构对数据项进行排序.前面提到过.堆数据结构中.节点大于或等于自己的子节点.那么我们能够将待排序的数据项依次加入到堆中,然后再依次取出根节点就可以.从堆中取出的数据项是从大到小排列的.由于根节点永远是最大的.而堆中永远是取根节点.假设对堆这样的数据结构不太了解的话,能够先看这篇博文:数据结构和算法之 堆.这里不再赘述. 以下我们来看看堆排序的实现(假设程序有不清楚的地方.也能够參考上面那篇博文). public class HeapSort { private

JavaScript 数据结构与算法之美 - 归并排序、快速排序、希尔排序、堆排序

1. 前言 算法为王. 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算法和方便以后复习. 之所以把归并排序.快速排序.希尔排序.堆排序放在一起比较,是因为它们的平均时间复杂度都为 O(nlogn). 请大家带着问题:快排和归并用的都是分治思想,递推公式和递归代码也非常相似,那它们的区别在哪里呢 ? 来阅读下文. 2. 归并排序(Merge Sort) 思想 排序一个数

[算法学习笔记]排序算法——堆排序

堆排序 堆排序(heapsort)也是一种相对高效的排序方法,堆排序的时间复杂度为O(n lgn),同时堆排序使用了一种名为堆的数据结构进行管理. 二叉堆 二叉堆是一种特殊的堆,二叉堆是完全二叉树或者是近似完全二叉树.二叉堆满足堆特性:父节点的键值总是保持固定的序关系于任何一个子节点的键值,且每个节点的左子树和右子树都是一个二叉堆. 如上图显示,(a)是一个二叉堆(最大堆), (b)是这个二叉堆在数组中的存储形式. 通过给个一个节点的下标i, 很容易计算出其父节点,左右子节点的的下标,为了方便,

面试常考数据结构与算法

数据结构部分: 1.数组和链表的区别.(很简单,但是很常考,记得要回答全面) C++语言中可以用数组处理一组数据类型相同的数据,但不允许动态定义数组的大小,即在使用数组之前必须确定数组的大小.而在实际应用中,用户使用数组之前无法确定数组的大小,只能够将数组定义成足够大小,这样数组的空间可能不被使用,从而造成内存空间的浪费.链表是一种常见的数据组织形式,他采用动态分配内存的形式实现.需要时可以用new分配内存空间,不需要时用delete将已分配的空间释放,不会造成内存空间的浪费. 从逻辑结构上来看

数据结构与算法系列 目录

最近抽空整理了"数据结构和算法"的相关文章.在整理过程中,对于每种数据结构和算法分别给出"C"."C++"和"Java"这三种语言的实现:实现语言虽不同,但原理如出一辙.因此,读者在了解和学习的过程中,择其一即可! 下面是整理数据数据和算法的目录表,对于每一种按照C/C++/Java进行了划分,方便查阅.若文章有错误或纰漏,请不吝指正.谢谢! 数据结构和算法目录表   C C++ Java 线性结构 1. 数组.单链表和双链表