zoukankan      html  css  js  c++  java
  • 排序算法 之 堆排序

      1 #include <iostream>
      2 #include <vector>
      3 #include <algorithm>
      4 
      5 using namespace std;
      6 
      7 //大根堆
      8 
      9 void push_up(vector<int>&heap , int heapPosize)
     10 {
     11     int t = heapPosize;
     12     while (t/2 && heap[t/2] < heap[t])///在堆里面,计数是从一开始的
     13     {
     14         swap(heap[t],heap[t/2]);
     15         t = t/2;
     16     }
     17 }
     18 void push_down(vector<int> &heap ,int heapSize, int heapPosion)
     19 {
     20     int t = heapPosion ;
     21     int leftChild = heapPosion*2;
     22     int rightChild = heapPosion*2+1;
     23     if (leftChild <= heapSize && heap[t] < heap[leftChild])
     24     {
     25         t = leftChild ;
     26     }
     27     if (rightChild <= heapSize && heap[t] < heap[rightChild])
     28     {
     29         t = rightChild ;
     30     }
     31     if (t != heapPosion)
     32     {
     33         swap( heap[t] , heap[heapPosion]);
     34         push_down(heap , heapSize , t);
     35     }
     36 }
     37 void insert(vector<int>&heap ,int data, int &heapsize)
     38 {
     39     heap.push_back(data);
     40     heapsize++;
     41     push_up(heap,heapsize);
     42 }
     43 
     44 void remove_top(vector<int>&heap , int &heapsize)
     45 {
     46    swap(heap[1],heap[heapsize]);
     47    heapsize--;
     48    heap.pop_back();
     49    push_down(heap,heapsize,1);
     50 }
     51 int creatHeap(vector<int> &heap )
     52 {
     53     int length = heap.size();
     54     heap.push_back(0);
     55 
     56     for (int i = length ; i > 0 ; i --) ///将heap的长度加一,移动数据
     57     {
     58         heap[i] = heap[i-1];
     59     }
     60 
     61     for(int i =1 ;i <= length ;i++)
     62     {
     63         push_up(heap,i);
     64 
     65         printf("push_up 第%d次 :" ,i);
     66         for (int j =1 ;j <= length ;j++)
     67         {
     68             printf("%d ",heap[j]);
     69         }
     70         printf("
    ");
     71     }
     72     return length;
     73 }
     74 void heap_sort(vector<int> &heap ,int heapSize)
     75 {
     76     //int heapSize = creatHeap(heap);
     77     int size = heapSize;
     78     for (int i = 1 ; i <= size ;++i)
     79     {
     80         swap(heap[1],heap[heapSize]);
     81         heapSize--;
     82         push_down(heap , heapSize , 1);
     83         printf("push_down 第%d次 :" ,i);
     84         for (int j =1 ;j <= size ;j++)
     85         {
     86             printf("%d ",heap[j]);
     87         }
     88         printf("
    ");
     89     }
     90     for (int i = 0 ; i < size ;i++) ///将数据还原
     91     {
     92         heap[i] = heap[i+1];
     93     }
     94     heap.pop_back();
     95 }
     96 #define n 5
     97 int main()
     98 {
     99     vector<int> heapData;
    100     heapData.resize(n);
    101     for(int i = 0 ; i < n ;i++)
    102     {
    103         cin >> heapData[i];
    104     }
    105 
    106     puts("排序前的数据为 :");
    107     for(int i = 0 ; i < n ;i++)
    108     {
    109         printf("%d ",heapData[i]);
    110     }
    111     printf("
    ");
    112 
    113     int length = creatHeap(heapData);
    114     remove_top(heapData,length);
    115     puts("删除头节点后的值为 :");
    116     for(int i = 1 ; i <= length ;i++)
    117     {
    118         printf("%d ",heapData[i]);
    119     }
    120     printf("
    ");
    121 
    122     puts("增加节点后的值为 :");
    123     insert(heapData ,26515, length);
    124     for(int i = 1 ; i <= length ;i++)
    125     {
    126         printf("%d ",heapData[i]);
    127     }
    128     printf("
    ");
    129 
    130     heap_sort(heapData,length);
    131     puts("排序后的数据为 :");
    132     for(int i = 0 ; i < length ;i++)
    133     {
    134         printf("%d ",heapData[i]);
    135     }
    136     printf("
    ");
    137     return 0;
    138 }

    最后结果为:

    12
    123
    12323
    26
    23
    排序前的数据为 :
    12 123 12323 26 23
    push_up 第1次 :12 123 12323 26 23
    push_up 第2次 :123 12 12323 26 23
    push_up 第3次 :12323 12 123 26 23
    push_up 第4次 :12323 26 123 12 23
    push_up 第5次 :12323 26 123 12 23
    删除头节点后的值为 :
    123 26 23 12
    增加节点后的值为 :
    26515 123 23 12 26
    push_down 第1次 :123 26 23 12 26515
    push_down 第2次 :26 12 23 123 26515
    push_down 第3次 :23 12 26 123 26515
    push_down 第4次 :12 23 26 123 26515
    push_down 第5次 :12 23 26 123 26515
    排序后的数据为 :
    12 23 26 123 26515
    请按任意键继续. . .

    To get,you have to give.To give,you need learn to insist.If you really find it is hard for you,then you quit.But once you quit.Don't complain.
  • 相关阅读:
    利用Python imaplib和email模块 读取邮件文本内容及附件内容
    sqlachemy 查询当日数据,
    【Flask】abort和errorhandler、app_errorhandler进行请求中断及自定义异常处理
    CentOS 7 安装与卸载MySQL 5.7
    解决python2.7 UnicodeDecodeError和UnicodeEncodeError问题
    python常用的十进制、16进制、字符串、字节串之间的转换
    Python任务调度模块 – APScheduler,Flask-APScheduler实现定时任务
    flask celery 使用方法
    Linux权限详解 命令之 chmod:修改权限
    MySQL中无GROUP BY直接HAVING的问题【转】
  • 原文地址:https://www.cnblogs.com/hit-ycy/p/10858660.html
Copyright © 2011-2022 走看看