zoukankan      html  css  js  c++  java
  • 算法练习:堆排序

    C++代码 1:

    #include <iostream>  
    #include <assert.h> 
    using namespace std;
    
    //调整堆
    //s:需要调整的非终端节点的位序
    //len:整个待排序数组的长度
    void HeapAdjust(int a[], int s, int len)
    {
        int tmp = a[s];
        for(int i=s*2; i<=len; i=i*2)
        {
            int largeIndex = i;
            if(i+1 <= len && a[i+1] > a[i])
            {
                largeIndex = i+1;
            }
            if(tmp < a[largeIndex])
            {
                a[s] = a[largeIndex];
                s = largeIndex;
            }
        }
        a[s] = tmp;
    }
    void HeapSort(int a[], int len)
    {
        //构建大根堆
        for(int i=len/2; i>=1; i--)
        {
            HeapAdjust(a, i, len);
        }
        //堆排序
        for(int i=len; i>=1; i--)
        {
            //交换每次调整后的堆的相应的第一个元素和最后一个元素
            int tmp = a[i];
            a[i] = a[1];
            a[1] = tmp;
            HeapAdjust(a, 1, i-1);
        }
    }
    int main() //堆排序,构建大根堆排序,输出数组元素的非递减序列
    //首先构建大根堆,然后交换根元素和最后一个元素->调整剩余的(n-1)个元素为新的大根堆,如此反复直到排序结束(即只剩下最后一个未排序元素)
    {
        int a[] = {0, 29, 345, 11, 3, 4, 899, 8, 1014};//因为堆排序的第一个元素序号为1,而数组的第一个元素序号为0,这里添加一个无用的首元素"0"
        int len = sizeof(a) / sizeof(int);
        
        cout << "----original----" << endl;
        for(int i=1; i<len; i++)
            cout << a[i] << " ";
        cout << endl;
    
        HeapSort(a, len-1);
    
        cout << "----result----" << endl;
        for(int i=1; i<len; i++)
            cout << a[i] << " ";
        cout << endl;
    
        cin.get();
        cin.get();
        return 0;
    }

    C++代码 2 :用递归方式实现调整堆

    #include <iostream>  
    #include <assert.h> 
    using namespace std;
    
    //调整堆
    //s:需要调整的非终端节点的位序
    //len:整个待排序数组的长度
    void HeapAdjust(int a[], int s, int len)
    {
    	int largeIndex = s;
    	int leftChildIndex = 2*s;
    	if(leftChildIndex<=len && a[s]<a[leftChildIndex])
    	{
    		largeIndex = leftChildIndex;
    	}
    	int rightChildIndex = 2*s + 1;
    	if(rightChildIndex<=len && a[s]<a[rightChildIndex] && a[leftChildIndex]<a[rightChildIndex])
    	{
    		largeIndex = rightChildIndex;
    	}
    	if(largeIndex != s)
    	{
    		int tmp = a[largeIndex];
    		a[largeIndex] = a[s];
    		a[s] = tmp;
    		//用递归方式实现调整堆
    		HeapAdjust(a, largeIndex, len);
    	}
    }
    void HeapSort(int a[], int len)
    {
    	//构建大根堆
    	for(int i=len/2; i>=1; i--)
    	{
    		HeapAdjust(a, i, len);
    	}
    	//堆排序
    	for(int i=len; i>=1; i--)
    	{
    		//交换每次调整后的堆的相应的第一个元素和最后一个元素
    		int tmp = a[i];
    		a[i] = a[1];
    		a[1] = tmp;
    		HeapAdjust(a, 1, i-1);
    	}
    }
    int main() //堆排序,构建大根堆排序,输出数组元素的非递减序列
    //首先构建大根堆,然后交换根元素和最后一个元素->调整剩余的(n-1)个元素为新的大根堆,如此反复直到排序结束(即只剩下最后一个未排序元素)
    {
    	int a[] = {0, 29, 345, 11, 3, 4, 899, 8, 1014};//因为堆排序的第一个元素序号为1,而数组的第一个元素序号为0,这里添加一个无用的首元素"0"
    	int len = sizeof(a) / sizeof(int);
    	
    	cout << "----original----" << endl;
    	for(int i=1; i<len; i++)
    		cout << a[i] << " ";
    	cout << endl;
    
    	HeapSort(a, len-1);
    
    	cout << "----result----" << endl;
    	for(int i=1; i<len; i++)
    		cout << a[i] << " ";
    	cout << endl;
    
    	cin.get();
    	cin.get();
        return 0;
    }
    
  • 相关阅读:
    由铭心提供的免费邮箱
    BT面板安装教程
    Onedrive分享型网盘搭建
    cookie与session
    IntelliJ Idea 2017 免费激活方法
    什么情况下出现的redis
    tomcat编码问题
    idea启动项目报Unable to open debugger port (127.0.0.1:11480): java.net.SocketException "socket closed"
    Sentry异常捕获平台
    亚瑟·阿伦博士的36个问题
  • 原文地址:https://www.cnblogs.com/wenwujuncheng/p/3970398.html
Copyright © 2011-2022 走看看