• 3. 堆排序


    一、介绍

    堆排序属于选择排序,它是利用这种数据结构而设计的一种排序算法。

    升序排序采用最大堆,而降序排序采用最小堆。

     

    二、基本思想

    将待排序的数列构造成一个最大堆,每次都取堆顶的元素,将其放在数列的最后面,然后将剩余的元素重新调整为最大堆,依次类推,最终得到升序的序列。

    主要过程:构建最大堆 + 交换堆顶元素和末尾元素并重建最大堆

    【详细步骤】

      a.将无序序列构建成一个最大堆;

      b.将堆顶元素与末尾元素交换,将最大元素"沉"到数组末端;

      c.重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前末尾元素。反复执行“调整+交换”步骤,直到整个序列有序。

     

    三、代码

    #include <iostream>
    #include <stack>
    #include <queue>
    
    using namespace std;
    
    /* 构造最大堆 */
    /*
     * a为待排序的数组 
     * n是元素的个数,这里假设从下标1开始存放元素,故原数组的大小应为n+1
     * 于是在完全二叉树中,由a[father] = a[lChild/2] = a[rChild/2] 
     */ 
    void init(int a[], int n)
    {
    	for(int i = n / 2; i > 0; --i) {
    		int temp = a[i];
    		int son = i * 2;
    		while(son <= n) {
    			if(son < n && a[son] < a[son+1])
    				son++;
    			if(temp > a[son])
    				break;
    			else {
    				a[son/2] = a[son];
    				son = son * 2;
    			}
    			
    		} 
    		a[son/2] = temp;
    	}
    } 
    
    int main()
    {
    	// a[0]不存放元素,所以是对n=7个元素进行排序 
    	int arr[8] = {0, 4, 3, 2, 7, 6, 8, 5};	
    
    	// 重建+交换  执行n-1次 
    	for(int i = 0; i < 6; ++i) {
    		init(arr, 7 - i);			// 构建最大堆 
    		swap(arr[1], arr[7-i]);		// 交换堆顶和末尾元素 
    	} 
    	
    	for(int i = 1; i <=7; ++i)
    		cout << arr[i] << " ";
    	cout << endl;
    
    	return 0;
    }
    

    补:上述构建最大堆的算法可查看《最大堆》。  

  • 相关阅读:
    八皇后(回溯经典)
    高精度阶乘(大数运算)
    跳棋(利用规范的数学方法)
    贪心砝码(分治法)
    大数乘方取余
    二分法查找
    汉诺塔(经典递归)(未完全明白)
    斐波那契数列和
    实验 7: OpenDaylight 实验——Python 中的 REST API 调用
    实验 6:OpenDaylight 实验——OpenDaylight 及 Postman 实现流表下发流表
  • 原文地址:https://www.cnblogs.com/xzxl/p/9580977.html
Copyright © 2020-2023  润新知