博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
堆排序的实现
阅读量:6977 次
发布时间:2019-06-27

本文共 2148 字,大约阅读时间需要 7 分钟。

堆排序的实现

在顺序结构上完成,先建堆然后重建堆,最后实现全部排序

(个人作法,仅供参考)

 

#include<stdio.h>

#include<stdlib.h>

#define max 100000

void HeapAdjust(int heap[],int k,int m)

{

    int i,j,finished;

    int temp;

    temp=heap[k];

    i=k;

    j=2*i;

    finished=false;

    while(j<=m&&!finished)

    {

        if(j<m&&heap[j]>heap[j+1])j=j+1;//筛选

        if(temp<=heap[j])finished=true;

        else

         {

            heap[i]=heap[j];

            i=j;

            j=2*i;

          }

     }

    heap[i]=temp;

}

void HeapAdjust2(int heap[],int k,int m)

{

    int i,j,finished;

    int temp;

    temp=heap[k];

    i=k;

    j=2*i;

    finished=false;

    while(j<=m&&!finished)

    {

        if(j<m&&heap[j]<heap[j+1])j=j+1;//筛选

        if(temp>=heap[j])finished=true;

        else

         {

            heap[i]=heap[j];

            i=j;

            j=2*i;

          }

     }

    heap[i]=temp;

}

void CreateHeap(int heap[],int length)

{

    int i,n=length;

    for(i=n/2;i>=1;--i)

        HeapAdjust(heap,i,n);

}

void CreateHeap2(int heap[],int length)

{

    int i,n=length;

    for(i=n/2;i>=1;--i)

        HeapAdjust2(heap,i,n);

}

void HeapSort(int heap[],int length)//对heap[1...n]进行堆排序

{

    int temp,i,n;

    CreateHeap(heap,length);

    n=length;

    for(i=n;i>=2;--i)

    {

        temp=heap[1];//将堆顶记录和堆中的最后一个记录互换

        heap[1]=heap[i];

        heap[i]=temp;

        HeapAdjust(heap,1,i-1);//进行调整,使heap[1...i-1]变成堆

    }

}

void HeapSort2(int heap[],int length)//对heap[1...n]进行堆排序

{

    int temp,i,n;

    CreateHeap2(heap,length);

    n=length;

    for(i=n;i>=2;--i)

    {

        temp=heap[1];//将堆顶记录和堆中的最后一个记录互换

        heap[1]=heap[i];

        heap[i]=temp;

        HeapAdjust2(heap,1,i-1);//进行调整,使heap[1...i-1]变成堆

    }

}

void PrintfHeap(int heap[],int length)

{

    int i;

    for(i=1;i<=length;i++)

    printf("%d ",heap[i]);

    printf("\n");

}

int main()

{system("color cf");  

  int heap[max];

  int n,i,choice;

  printf("        堆排序功能选项\n");

  printf("  1.输入一个新序列并进行堆排序\n");

  printf("  2.输出当前序列大顶堆排序\n");

  printf("  3.输出当前序列小顶堆排序\n");

  printf("  4.退出堆排序\n");

loop1: printf("请选择你的操作:");

       scanf("%d",&choice);

switch(choice)

   {

loop2: case 1:

         printf("请输入序列的个数:");

         scanf("%d",&n);

         printf("请依次输入将要进行堆排序的元素:\n");

       for(i=1;i<=n;i++)

           scanf("%d",&heap[i]);

           heap[0]=n;

           goto loop1;

loop3: case 2: 

           HeapSort(heap,n);

           printf("从大到小排序:\n");

           PrintfHeap(heap,heap[0]);

           goto loop1; 

loop4: case 3:   

           HeapSort2(heap,n);

           printf("从小到大排序:\n");

           PrintfHeap(heap,heap[0]);

           goto loop1;       

       case 4: printf("欢迎再来\n"); break;

       default:

            exit(0);

    }

return 0;

}

 

}

   

 

                 

2.功能界面

 

 

                       

 

 

转载于:https://www.cnblogs.com/wc1903036673/p/3427944.html

你可能感兴趣的文章
SQL语句计算周岁
查看>>
Linux errno详解
查看>>
笨方法学python之import sys与from sys import argv的区别
查看>>
关于全景漫游
查看>>
[Linux: vim]vim自动生成html代码
查看>>
thinkphp5的auth权限认证(转自thinkphp官方文档+自己总结)
查看>>
编程颜色汇总
查看>>
CPU从内存中读取数据的过程
查看>>
PHP 判断用户是否手机访问
查看>>
rabbitMQ安装
查看>>
Laravel 验证中文本地化
查看>>
Redis学习笔记(9)-管道/分布式
查看>>
关于react的一些总结
查看>>
oracle数据库迁移
查看>>
规范很重要
查看>>
2018-09-10-weekly
查看>>
java单点登录
查看>>
HDU 4268 Alice and Bob [贪心]
查看>>
安卓市场--框架搭建3
查看>>
【矩阵哈希】【哈希表】bzoj2351 [BeiJing2011]Matrix
查看>>