`
543089122
  • 浏览: 153279 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

简单_堆排序算法

阅读更多
package sunfa.sort;

import java.util.Arrays;
import java.util.Comparator;
import java.util.Random;

public class HeapSort {
	public static void main(String[] args) {
		int n = 20;
		Random ran = new Random();
		int[] arr = new int[n];
		Heap<Integer> heap = new Heap<Integer>(n, new Comparator<Integer>() {
			public int compare(Integer o1, Integer o2) {
				return o2 - o1;
			}
		});
		for (int i = 0; i < n; i++) {
			int o = ran.nextInt(100);
			arr[i] = o;
			heap.add(o);
		}
		System.out.println(Arrays.toString(arr));
//		System.out.println(Arrays.toString(heap.getHeap()));
//		System.out.println(heap.getHeap()[heap.count()]);
//		heap.swap(heap.getHeap(), 1, heap.count());
//		System.out.println("swap:" + Arrays.toString(heap.getHeap()));
//		heap.heapify(1, heap.count());
		System.out.println(Arrays.toString(heap.getHeap()));

		System.out.println("堆排序:");
		/**
		 * 堆排序的思想是:<br>
		 * 以最大堆为例<br>
		 * ①把堆头和堆尾2个数交换<br>
		 * ②将堆头到堆尾-1这个范围内的数进行堆化<br>
		 * 重复上面2个步骤直到②步中要被堆化的数据长度为1<br>
		 * 
		 * 算法分析<br>
		 * 堆[排序的时间,主要由建立初始]堆和反复重建堆这两部分的时间开销构成,它们均是通过调用Heapify实现的。<br>
		  堆排序的最坏时间复杂度为O(nlogn)。堆序的平均性能较接近于最坏性能。<br>
		  由于建初始堆所需的比较次数较多,所以堆排序不适宜于记录数较少的文件。<br>
		  堆排序是就地排序,辅助空间为O(1),<br>
		  它是不稳定的排序方法。<br>
		 */
		int last = heap.count();
		while (last - 1 > 1) {
			heap.swap(heap.getHeap(), 1, last--);
			if (last - 1 > 1) {
				heap.heapify(1, last);
			}
			System.out.println("堆化后:" + ",last:" + last
					+ Arrays.toString(heap.getHeap()));
		}
	}
}

class Heap<E> {
	private Object[] heap;
	private int size;
	Comparator<E> comp;

	public Object[] getHeap() {
		return heap;
	}

	public int count() {
		return size;
	}

	public Heap(int n, Comparator<E> c) {
		if (n < 0)
			throw new IllegalArgumentException("n:" + n);
		comp = c;
		heap = new Object[n];
	}

	public void add(E e) {
		if (size + 1 == heap.length)
			heap = Arrays.copyOf(heap, heap.length << 1);
		heap[++size] = e;
		fixUp(size);
	}

	private void fixUp(int k) {
		while (k > 1) {
			int p = k >>> 1;
			if (compare((E) heap[k], (E) heap[p]) > 0)
				break;
			swap((E[]) heap, k, p);
			k = p;
		}
	}

	public void swap(Object[] e, int a, int b) {
		Object t = e[a];
		e[a] = e[b];
		e[b] = t;
	}

	private int compare(E t1, E t2) {
		return comp == null ? (((Comparable<E>) t1).compareTo(t2)) : (comp
				.compare(t1, t2));
	}

	private void fixDown(int k) {
		int j;
		while ((j = k << 1) <= size) {
			if (j < size && compare((E) heap[j], (E) heap[j + 1]) > 0)
				j++;
			if (compare((E) heap[k], (E) heap[j + 1]) < 0)
				break;
			swap((E[]) heap, k, j);
			k = j;
		}
	}

	/**
	 * 对指定范围内的数据进行堆化
	 * @param a  开始索引
	 * @param b  结束索引
	 */
	public void heapify(int a, int b) {
		for (int i = b; i >= a; i--) {
			fixUp(i);
		}
	}
}

分享到:
评论

相关推荐

    实现各种排序算法并分析与比较.rar_shell排序_各种排序_各种排序算法_堆排序_快速排序

    本文将深入探讨标题和描述中提及的几种排序算法:直接插入排序、希尔排序(SHELL排序)、冒泡排序、快速排序、简单选择排序、堆排序以及归并排序,并对它们进行分析和比较。 1. **直接插入排序**: - 直接插入排序...

    C++堆排序实现算法

    简单的堆排序算法:以定长数组为例,动态数组等可以以此类推

    7.1_内部排序算法排序.CPP

    1、常见排序算法实现(1-6选择几个算法练习) 1)问题描述:输入一组... (5)实现堆排序算法。 (6)合并排序算法。 2) 实现提示: 数据输入后,每选择一种算法,把数据拷贝后再排序,保证原始数据不破坏.

    mfc-sort.zip_mfc sort_mfc实现排序_mfc排序_排序演示 MFC_排序算法 演示

    标签“mfc_sort mfc实现排序 mfc排序 排序演示_mfc 排序算法_演示”是对关键词的强调,这些关键词突出了MFC、排序、演示和算法的关键元素。 在压缩包“排序算法演示”中,我们可以期待找到实现这些功能的源代码和...

    堆排序算法源代码

    在这个名为"sort"的压缩包中,很可能包含了实现堆排序算法的C/C++源文件。 堆排序的核心思想是利用树形数据结构——堆(Heap)来完成排序。堆是一个近似完全二叉树的结构,同时满足大顶堆(父节点的值大于或等于其...

    堆排序算法简单实现

    3. **完整过程**:堆排序算法通常包含两个阶段,构建堆和交换下沉。首先,通过从最后一个非叶子节点开始,自上而下地调整整个序列,使其成为一个合法的堆。然后,在这个过程中不断交换堆顶元素和末尾元素,每次交换...

    zhijiecharupaixu.rar_插入排序_插入排序算法

    在实际应用中,当处理大规模数据或对性能要求较高的情况时,通常会选择更高效的排序算法,如快速排序、归并排序或堆排序等。然而,对于小规模数据,直接插入排序的常数因子较小,因此可能比其他复杂排序算法更快。

    排序算法_排序算法汇总_排序算法_gettingzop_

    1. **插入排序**:插入排序是一种简单直观的排序算法,它的工作原理类似于我们平时手动排序扑克牌。算法通过比较未排序序列中的元素与已排序序列的元素,找到合适的位置并插入。时间复杂度在最坏情况下为O(n^2),但...

    排序算法之堆排序算法:用C++语言实现堆排序算法

    标题"排序算法之堆排序算法:用C++语言实现堆排序算法",意味着我们将讨论如何用C++编程语言来实现堆排序的过程。C++是面向对象的编程语言,具有丰富的库支持和高效的执行性能,是实现算法的理想选择。 描述"排序...

    C++语言的算法实现包括插入排序冒泡排序堆排序快速排序

    插入排序是一种简单的排序算法,它的基本思想是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。在C++中,可以使用两层循环实现,外层循环控制未排序部分,内层循环寻找插入...

    实验1_排序_算法设计与分析_

    选择排序是一种简单直观的排序算法。它的工作原理是每一次从未排序的序列中找到最小(或最大)的元素,放到已排序序列的末尾,直到全部待排序的数据元素排完。选择排序的主要优点在于其交换次数较少,但它的主要...

    xuanze.rar_排序_排序算法_选择_选择排序

    在实际编程中,虽然选择排序在效率上不如其他高级算法(如快速排序、归并排序或堆排序),但它因为其简单性在教学和理解排序算法时仍占有重要地位。对于小规模数据或者特定场景,选择排序仍然可以是一个可行的解决...

    经典算法之七大排序.zip_organized6k4_排序_排序算法

    在本资源"经典算法之七大排序.zip_organized6k4_排序_排序算法"中,包含了七种经典的排序算法,它们分别是:冒泡排序、直接插入排序、直接选择排序、希尔排序、归并排序、快速排序和堆排序。以下将对这七种排序算法...

    01_bubble_sort_冒泡排序算法python实现_

    在实际应用中,更高效的排序算法如快速排序、归并排序和堆排序等通常会得到优先考虑。 总结一下,冒泡排序是一种基础的排序算法,通过不断比较和交换相邻元素来实现排序。Python中的实现直观简洁,但效率相对较低。...

    Test_1_18 排序_排序算法_

    冒泡排序是一种简单的排序算法,通过重复遍历待排序的列表,比较相邻元素并交换位置来完成排序。如果前一个元素大于后一个元素,它们就会“冒泡”到正确的位置。这个过程会一直持续,直到列表完全排序。 二、选择...

    7大排序算法实现程序(快速排序,冒泡排序,选择排序,归并排序,插入排序,希尔排序,堆排序)

    2. 冒泡排序:是最简单的排序算法之一,通过不断交换相邻位置的元素来逐渐达到排序的目的。每一轮遍历都能确保最大(或最小)的元素被放置到正确的位置,重复这个过程直到整个数组排序完成。 3. 选择排序:每次从未...

    八大排序算法C语言

    6. **堆排序**:堆排序利用了堆这种数据结构,可以看作是完全二叉树的数组表示。它首先构造一个大顶堆或小顶堆,然后将堆顶元素与末尾元素交换,再调整剩余元素形成新的堆。时间复杂度为O(n log n)。 7. **希尔排序...

    堆排序算法实现堆排序

    堆排序是一种基于比较的排序算法,它通过构造一个近似完全二叉树的堆结构来实现数据的排序。在此,我们将深入探讨堆排序的基本概念、原理以及如何通过编程实现。 一、堆排序的概念 堆是一个近似完全二叉树的结构,...

    数据结构课程设计实验报告_内部排序算法比较.doc

    实验中涉及的排序算法包括:冒泡排序、直接插入排序、简单选择排序、快速查找排序、希尔排序和堆排序。 1. **冒泡排序**: 冒泡排序是一种简单的排序方法,它通过重复遍历要排序的数列,一次比较两个元素,如果...

    _各种排序算法java实现.doc

    在实际编程中,我们还会遇到其他更高效的排序算法,如快速排序、归并排序、堆排序等,这些高级排序算法在处理大数据量时表现更优秀,但实现起来也相对复杂。理解并掌握这些基本排序算法有助于我们更好地理解和使用更...

Global site tag (gtag.js) - Google Analytics