选择排序之堆排序

/*
* 选择排序之堆排序
* 按照完全二叉树的顺序存储方式,建立一颗完全二叉树
* 若是大根堆:l(i)>=l(2*i),l(i)>=l(2*i+1)
* 若是小根堆:l(i)<=l(2*i),l(i)<=(2*i+1)
* 此时,初始堆建成,接下来的工作是进行调整
* 调整的是从[n/2]~1。
* 针对大根堆:对于[n/2]处的元素,若其比左右孩子中的较大者小,进行交换
* 同理对于其他的
* void BuildHeap(ET a[],int len){
* for(int i=n/2;i>0;i--){
* AdjustDown(a[],i,len);
* }
* void AdjustDown(ET a[],int k,int len){
* a[0]=a[k];
* for(i=2*k;i<=len;i=i*2){
* if(i<len&&a[i]<a[i+1])
* i++;
* if(a[0]>a[i])
* break;//排序成功,跳出循环
* else{
* a[k]=a[i];//a[i]向上翻,反正a[k]的值已经赋出去了,有了本分
* k=i; //同时新的待排序的k就是i,要继续向下继续调整
* }
* }
* a[k]=a[0];//最终的位置
* }

* 下面要说的是完整的堆排序过程
* 在建成一个真正意义上的对之后,我们还需要将其输出,这样我们才能直观的看到算法处理的结果
* 而堆排序的输出,通常是输出堆顶元素后,通常将堆底元素送入堆顶,但此时肯定是不满足堆的性质的,
* 所以此时必要又要重新调整堆,待调整完毕后,在进行输出,循环如此
* void HeapSort(ET a[],int len){
* BulidHeap(a,len);
* for(i=len;i>1;i--){
* print(a[1]);//输出堆顶元素
* swap(a[len],a[1]);//将最后堆底元素换到堆顶
* AdjustDown(a,1,len-1);//输出一个元素后,还剩len-1
*
* }
*
* }

堆排序的时间复杂度跟最终形成的树形状有关

建堆时间是O(n),之后进行n-1次的调整(在建造堆的时候有一半,而在输出的时候又有一半?),每次调整的时间与树的高度有关,那就是O(h),又因是完全二叉树,所以最终的时间复杂度为O(nlogn)
*
* }
*/

时间: 2024-11-02 23:27:53

选择排序之堆排序的相关文章

选择排序:堆排序

堆排序(Heap Sort):使用堆这种数据结构来实现排序. 先看下堆的定义: 最小堆(Min-Heap)是关键码序列{k0,k1,-,kn-1},它具有如下特性: ki<=k2i+1, ki<=k2i+2(i=0,1,-) 简单讲:孩子的关键码值大于双亲的. 同理可得,最大堆(Max-Heap)的定义: ki>=k2i+1, ki>=k2i+2(i=0,1,-) 同样的:对于最大堆,双亲的关键码值大于两个孩子的(如果有孩子). 堆的特点: 堆是一种树形结构,而且是一种特殊的完全二

排序算法2--简单选择排序、堆排序

一.简单选择排序和堆排序都属于选择排序 选择排序的思想是:每一趟从待排序的记录中选出关键字最小的记录,按顺序放在以排序的记录序列的后面,知道全部拍完为止. 二.简单选择排序(直接选择排序) 1.简单选择排序法是每次循环找出最值,循环结束后将最值调整到合适位置,交换的次数少. 每次找出当前无序队列中的最小的元素与第一个交换位置,再选择第二小的与第二个交换位置 原始队列:   3 5 6 2 4 1(最小元素1与3交换) 第一步: 1 5 6 2 4 3 (当前最小元素2与5交换) 第二步: 1 2

排序算法七:选择排序之堆排序

排序算法七:选择排序之堆排序 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 引言 在我的博文<"主宰世界"的10种算法短评>中给出的首个算法就是高效的排序算法.本文将对排序算法做一个全面的梳理,从最简单的"冒泡"到高效的堆排序等. 上博文讲述了选择排序中的简单排序算法,本文介绍的堆排序是树性选择排序,采用堆这个数据结构来辅助排序. 排序相关的的基本概念 排序:将一组杂乱无章的数据按一定的规律顺次排列起来. 数据

选择排序算法---直接选择排序和堆排序

本文主要是解析选择排序算法:直接选择排序和堆排序. 一.直接选择排序   基本思想:       选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾.以此类推,直到所有元素均排序完毕. 选择排序的主要优点与数据移动有关.如果某个元素位于正确的最终位置上,则它不会被移动.选择排序每次交换一对元素,它们当中至少有一个将被移到其最终

C# 插入排序 冒泡排序 选择排序 快速排序 堆排序 归并排序 基数排序 希尔排序

下面列出了数据结构与算法的八种基本排序:插入排序 冒泡排序 选择排序 快速排序 堆排序 归并排序 基数排序 希尔排序,然后是测试的例子.代码位置:http://download.csdn.net/detail/luozuolincool/8040027 排序类: public class Sortings { //插入排序 public void insertSort(int[] array) { int temp = 0; int index = 0; for (int i = 0; i <

百万数据排序:优化的选择排序(堆排序)

  前一篇给大家介绍了<必知必会的冒泡排序和快速排序(面试必知)>,现在继续介绍排序算法          本博文介绍首先介绍直接选择排序,然后针对直接选择排序的缺点改进的"堆排序",堆排序非常适合:数组规模非常大(数百万或更多) + 严格要求辅助空间的场景.   直接选择排序 (一)概念及实现 直接选择排序的原理:将整个数组视为虚拟的有序区和无序区,重复的遍历数组,每次遍历从无序区中选出一个最小(或最大)的元素,放在有序区的最后,每一次遍历排序过程都是有序区元素个数增加,

Python八大算法的实现,插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序、基数排序。

Python八大算法的实现,插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的.个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2).是稳定的排序方法.插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素).在第一部分排序完成后,再将这

算法之简单选择排序和堆排序

3. 选择排序-简单选择排序(Simple Selection Sort) 基本思想: 在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换:然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止. 简单选择排序的示例: 操作方法: 第一趟,从n 个记录中找出关键码最小的记录与第一个记录交换: 第二趟,从第二个记录开始的n-1 个记录中再选出关键码最小的记录与第二个记录交换: 以此类推.....

排序(插入排序,希尔排序,选择排序,堆排序)

选择排序 工作原理:每一次从待排序的数据元素中选出最大或最小的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完. void SelectSort(int* a, size_t size) {     assert(a);     for (int i = 0; i < size; i++)     {         int min = i;         for (int j = i + 1; j < size; j++)         {         //选择最小元素