一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - C/C++ - C++實(shí)現(xiàn)堆排序示例

C++實(shí)現(xiàn)堆排序示例

2021-12-23 14:42雙魚211 C/C++

這篇文章主要介紹了C++實(shí)現(xiàn)堆排序示例,全文運(yùn)用大量代碼完成堆排序,需要了解的朋友可以參考一下這篇文章

堆的實(shí)現(xiàn)

Heap.h 堆的管理及接口

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
 
typedef int HPDataType;
typedef struct Heap
{
    HPDataType* a;
    int size;
    int capacity;
}Heap;
 
//堆的向下調(diào)整算法
void AdjustDown(HPDataType* a, int n, int root);
//堆的向上調(diào)整算法
void AdjustUp(HPDataType* a, int child);
//堆的初始化
void HeapInit(Heap* php, HPDataType* a,int n);
//堆的銷毀
void HeapDestroy(Heap* php);
//堆的插入
void HeapPush(Heap* php, HPDataType x);
//堆的刪除
void HeapPop(Heap* php);
//堆里的數(shù)據(jù)個(gè)數(shù)
int HeapSize(Heap* php);
//判斷堆是否為空
int HeapEmpty(Heap* php);
//取堆頂數(shù)據(jù)
HPDataType HeapTop(Heap* php);

Heap.c 堆各個(gè)接口功能的實(shí)現(xiàn)

• 堆的插入:將x插入下標(biāo)為size的位置,++size然后使用向上調(diào)整算法調(diào)整
• 堆的刪除(刪棧頂數(shù)據(jù)):將棧頂數(shù)據(jù)和下標(biāo)為size-1位置的數(shù)據(jù)交換,然后–size,使用向下調(diào)整算法調(diào)整

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include "Heap.h"
 
//堆向下調(diào)整算法
//建小堆
void AdjustDown(HPDataType* a, int n, int root)
{
    int parent = root;
    int child = parent * 2 + 1;
    //孩子超過數(shù)組下標(biāo)結(jié)束
    while (child < n)
    {
        //child始終左右孩子中小的那個(gè)
        if (a[child + 1] < a[child] && child + 1 <n)//防止沒有右孩子
        {
            ++child;
        }
        //小的往上浮,大的往下沉
        if (a[child] < a[parent])
        {
            int tem = a[parent];
            a[parent] = a[child];
            a[child] = tem;
            parent = child;
            child = parent * 2 + 1;
        }
        //中途child>parent則已滿足小堆,直接break
        else
        {
            break;
        }
    }
}
//堆的向上調(diào)整算法
//建小堆
void AdjustUp(HPDataType* a, int child)
{
    int parent = (child - 1) / 2;
    while (child > 0)
    {
        if (a[child] < a[parent])
        {
            int tem = a[parent];
            a[parent] = a[child];
            a[child] = tem;
            child = parent;
            parent = (child - 1) / 2;
        }
        else
        {
            break;
        }
    }
}
//堆的初始化
void HeapInit(Heap* php, HPDataType* a, int n)
{
    assert(php);
    assert(a);
    php->a = (HPDataType*)malloc(n * sizeof(HPDataType));
    if (php->a == NULL)
    {
        printf("malloc fail\n");
        exit(-1);
    }
    for (int i = 0; i < n; i++)
    {
        php->a[i] = a[i];
    }
    //建堆
    for (int i = (n - 2) / 2; i >= 0; --i)
    {
        AdjustDown(php->a, n, i);
    }
    php->capacity = n;
    php->size = n;
}
//堆的銷毀
void HeapDestroy(Heap* php)
{
    assert(php);
    free(php->a);
    php->a = NULL;
    php->capacity = 0;
    php->size = 0;
}
//堆的插入
void HeapPush(Heap* php, HPDataType x)
{
    assert(php);
    if (php->size == php->capacity)
    {
        HPDataType* tem = (HPDataType*)realloc(php->a,php->capacity * 2 * sizeof(HPDataType));
        if (tem == NULL)
        {
            printf("realloc fail\n");
            exit(-1);
        }
        php->a = tem;
        php->capacity *= 2;
    }
    php->a[php->size] = x;
    ++php->size;
    AdjustUp(php->a,php->size - 1);
}
//堆的刪除
void HeapPop(Heap* php)
{
    assert(php);
    assert(php->size > 0);
    HPDataType tem = php->a[php->size - 1];
    php->a[php->size - 1] = php->a[0];
    php->a[0] = tem;
    --php->size;
    AdjustDown(php->a, php->size, 0);
}
//堆里的數(shù)據(jù)個(gè)數(shù)
int HeapSize(Heap* php)
{
    assert(php);
    return php->size;
}
//判斷堆是否為空
//為空返回1,不為空返回0
int HeapEmpty(Heap* php)
{
    assert(php);
    return php->size == 0 ? 1 : 0;
}
//取堆頂數(shù)據(jù)
HPDataType HeapTop(Heap* php)
{
    assert(php);
    assert(php->size > 0);
    return php->a[0];
}

test.c測(cè)試

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "Heap.h"
 
void TestHeap()
{
    int arr[] = { 27, 28, 65, 25, 15, 34, 19, 49, 18, 37 };
    Heap hp;
    HeapInit(&hp, arr, sizeof(arr)/sizeof(int));
    while (!HeapEmpty(&hp))
    {
        printf("%d ", HeapTop(&hp));
        HeapPop(&hp);
 
    }
    printf("\n");
    HeapDestroy(&hp);
}
int main()
{
    TestHeap();
    return 0;
}

以上就是C++實(shí)現(xiàn)堆排序示例的詳細(xì)內(nèi)容,更多關(guān)于C++實(shí)現(xiàn)堆排序的資料請(qǐng)關(guān)注服務(wù)器之家其它相關(guān)文章!

原文鏈接:https://blog.csdn.net/weixin_50886514/article/details/114981407

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 456亚洲人成高清在线 | 亚洲国产麻豆 | 百合漫画咱啪全彩抚慰 | 午夜精品区 | 美女做又爽又黄又猛 | 视频一区二区国产 | 午夜精品久久久久久久99蜜桃i | 网站视频免费 | 美女18隐私羞羞视频网站 | 国产清纯白嫩大学生正在播放 | xxxx意大利xxxxhd | 草莓视频深夜释放 | 亚洲精品在线网址 | 韩国成人毛片aaa黄 含羞草国产亚洲精品岁国产精品 | 第一福利在线导航 | chinese国产人妖videos | 91香蕉视频在线 | 秋霞色| 国产麻豆91网在线看 | 欧美日韩一级视频 | 被老头肉至怀孕小说 | 亚裔aⅴ艳星katsuni | 1313午夜精品理伦片 | 男老头澡堂gay老头456 | 亚欧有色在线观看免费版高清 | 蜜桃88av| 国产成人免费片在线视频观看 | 秋霞色 | 国产真实一区二区三区 | 日韩欧免费一区二区三区 | 免费在线观看网址入口 | 久久精品国产只有精品 | 欧美久久影院 | 好 舒服 好 粗 好硬 好爽 | 免费一级特黄特色大片在线 | 7777色鬼xxxx欧美色夫 | 九九热综合| 欧美另类69xxx | 日本捏胸吃奶视频免费 | 白鹿扒开内裤露出尿孔 | 国产精品视频第一页 |