python实现堆排序

堆排序实际上是利用堆的性质来进行排序的,要知道堆排序的原理我们首先一定要知道什么是堆。 
堆的定义: 
堆实际上是一棵完全二叉树。 
堆满足两个性质: 
1、堆的每一个父节点都大于(或小于)其子节点; 
2、堆的每个左子树和右子树也是一个堆。 
堆的分类: 
堆分为两类: 
1、最大堆(大顶堆):堆的每个父节点都大于其孩子节点; 
2、最小堆(小顶堆):堆的每个父节点都小于其孩子节点; 
这里写图片描述 
堆的存储: 
一般都用数组来表示堆,i结点的父结点下标就为(i – 1) / 2。它的左右子结点下标分别为2 * i + 1和2 * i + 2。如下图所示: 
这里写图片描述 
堆排序: 
由上面的介绍我们可以看出堆的第一个元素要么是最大值(大顶堆),要么是最小值(小顶堆),这样在排序的时候(假设共n个节点),直接将第一个元素和最后一个元素进行交换,然后从第一个元素开始进行向下调整至第n-1个元素。所以,如果需要升序,就建一个大堆,需要降序,就建一个小堆。 
堆排序的步骤分为三步: 
1、建堆(升序建大堆,降序建小堆); 
2、交换数据; 
3、向下调整。 

假设我们现在要对数组arr[]={8,5,0,3,7,1,2}进行排序(降序): 
首先要先建小堆: 
这里写图片描述
堆建好了下来就要开始排序了: 
这里写图片描述
现在这个数组就已经是有序的了。 

import random


def MAX_Heapify(heap, HeapSize, root):  # 在堆中做结构调整使得父节点的值大于子节点

    left = 2 * root + 1
    right = left + 1
    larger = root
    if left < HeapSize and heap[larger] < heap[left]:
        larger = left
    if right < HeapSize and heap[larger] < heap[right]:
        larger = right
    if larger != root:  # 如果做了堆调整则larger的值等于左节点或者右节点的,这个时候做对调值操作
        heap[larger], heap[root] = heap[root], heap[larger]
        MAX_Heapify(heap, HeapSize, larger)


def Build_MAX_Heap(heap):  # 构造一个堆,将堆中所有数据重新排序
    HeapSize = len(heap)  # 将堆的长度当独拿出来方便
    for i in range((HeapSize - 2) // 2, -1, -1):  # 从后往前出数
        MAX_Heapify(heap, HeapSize, i)


def HeapSort(heap):  # 将根节点取出与最后一位做对调,对前面len-1个节点继续进行对调整过程。
    Build_MAX_Heap(heap)
    for i in range(len(heap) - 1, -1, -1):
        heap[0], heap[i] = heap[i], heap[0]
        MAX_Heapify(heap, i, 0)
    return heap


if __name__ == '__main__':
    a = [30, 50, 57, 77, 62, 78, 94, 80, 84]
    print(a)
    HeapSort(a)
    print(a)
    b = [random.randint(1, 1000) for i in range(1000)]
    print(b)
    HeapSort(b)
    print(b)

 

结果:

D:\Anaconda\python.exe E:/pythonwork/python实现堆排序.py
[30, 50, 57, 77, 62, 78, 94, 80, 84]
[30, 50, 57, 62, 77, 78, 80, 84, 94]
[715, 292, 828, 229, 617, 540, 416, 388, 268, 973, 266, 351, 815, 532, 525, 435, 402, 654, 773, 92, 892, 727, 257, 161, 725, 538, 568, 933, 399, 901, 201, 662, 774, 664, 251, 823, 497, 511, 400, 84, 168, 320, 999, 136, 348, 496, 295, 107, 821, 946, 728, 497, 565, 167, 886, 819, 823, 467, 542, 517, 778, 990, 497, 901, 359, 70, 164, 230, 206, 278, 936, 921, 897, 874, 438, 952, 574, 764, 933, 234, 605, 464, 375, 211, 496, 13, 698, 759, 737, 363, 930, 662, 557, 295, 96, 849, 382, 138, 327, 872, 740, 889, 31, 724, 206, 997, 756, 502, 344, 186, 701, 107, 160, 246, 75, 432, 468, 78, 29, 648, 566, 792, 4, 687, 882, 311, 403, 826, 750, 274, 837, 59, 564, 433, 445, 145, 515, 789, 134, 166, 742, 269, 290, 45, 636, 201, 853, 526, 158, 5, 139, 851, 716, 79, 956, 256, 915, 713, 793, 531, 826, 142, 260, 552, 518, 757, 40, 255, 752, 366, 177, 619, 475, 886, 835, 954, 965, 805, 595, 124, 790, 568, 905, 847, 952, 716, 586, 34, 959, 710, 853, 86, 328, 907, 418, 826, 648, 986, 612, 92, 544, 317, 937, 121, 439, 580, 471, 572, 92, 291, 351, 719, 669, 824, 370, 258, 474, 642, 884, 137, 585, 952, 450, 518, 372, 892, 943, 688, 344, 56, 428, 561, 1, 388, 276, 617, 437, 528, 797, 190, 581, 515, 397, 182, 724, 904, 918, 61, 494, 261, 10, 392, 416, 874, 824, 928, 37, 185, 498, 414, 173, 174, 527, 560, 952, 43, 591, 304, 329, 714, 498, 48, 876, 580, 505, 864, 706, 601, 330, 476, 695, 566, 975, 194, 917, 504, 887, 867, 555, 599, 338, 858, 632, 209, 771, 410, 549, 308, 474, 378, 868, 871, 269, 783, 635, 21, 714, 429, 706, 467, 714, 633, 12, 90, 146, 717, 435, 752, 187, 550, 910, 667, 775, 781, 89, 257, 315, 990, 275, 349, 864, 919, 853, 542, 448, 756, 307, 230, 667, 267, 338, 513, 165, 747, 18, 359, 334, 203, 50, 245, 290, 250, 493, 480, 408, 720, 746, 104, 995, 75, 102, 117, 238, 698, 75, 868, 786, 825, 792, 895, 766, 577, 677, 711, 93, 841, 421, 400, 872, 178, 479, 43, 385, 619, 347, 653, 765, 691, 249, 525, 20, 928, 749, 933, 487, 463, 517, 156, 328, 182, 408, 896, 679, 69, 359, 261, 77, 646, 371, 478, 829, 57, 550, 669, 340, 436, 40, 965, 416, 542, 55, 757, 918, 333, 272, 55, 183, 604, 87, 331, 185, 73, 13, 182, 958, 493, 161, 905, 546, 314, 273, 52, 190, 404, 303, 269, 291, 424, 889, 48, 535, 393, 840, 11, 542, 539, 844, 300, 548, 504, 112, 713, 31, 937, 185, 216, 277, 577, 270, 731, 304, 293, 327, 442, 826, 470, 794, 224, 719, 935, 608, 814, 445, 536, 72, 273, 20, 110, 45, 342, 681, 436, 36, 587, 130, 858, 482, 521, 924, 210, 977, 506, 551, 928, 925, 36, 705, 698, 383, 661, 891, 126, 324, 666, 129, 779, 980, 177, 891, 461, 524, 50, 361, 504, 658, 590, 587, 372, 752, 100, 965, 556, 272, 860, 448, 440, 183, 178, 920, 497, 541, 918, 151, 821, 295, 814, 370, 401, 669, 127, 186, 704, 276, 33, 722, 12, 237, 981, 940, 233, 753, 278, 165, 910, 144, 574, 365, 334, 188, 964, 454, 768, 115, 89, 428, 133, 918, 514, 333, 464, 30, 809, 547, 861, 171, 43, 694, 848, 556, 690, 776, 523, 265, 3, 368, 20, 380, 964, 654, 69, 42, 780, 384, 936, 447, 296, 967, 694, 190, 632, 489, 27, 231, 61, 890, 623, 620, 228, 639, 757, 588, 52, 555, 41, 699, 385, 97, 188, 21, 515, 494, 713, 25, 532, 20, 146, 726, 627, 324, 237, 837, 45, 17, 718, 228, 933, 550, 765, 789, 281, 251, 964, 976, 169, 377, 310, 477, 658, 264, 740, 266, 707, 384, 63, 883, 946, 877, 944, 837, 78, 773, 482, 110, 112, 869, 437, 916, 409, 876, 410, 329, 394, 263, 267, 16, 775, 436, 993, 702, 920, 363, 502, 764, 939, 517, 733, 595, 821, 165, 280, 319, 391, 384, 486, 959, 224, 741, 526, 308, 94, 585, 243, 849, 925, 342, 511, 132, 705, 148, 984, 380, 891, 217, 149, 656, 886, 700, 874, 256, 607, 177, 28, 75, 752, 428, 471, 393, 673, 464, 588, 885, 418, 998, 820, 472, 456, 492, 151, 937, 767, 29, 559, 785, 221, 389, 424, 366, 739, 401, 46, 253, 126, 702, 870, 507, 7, 508, 43, 99, 929, 111, 56, 808, 12, 903, 753, 842, 951, 373, 537, 344, 374, 94, 620, 156, 963, 390, 887, 377, 338, 277, 133, 625, 235, 897, 613, 964, 157, 37, 567, 100, 244, 816, 296, 12, 604, 442, 570, 424, 178, 580, 610, 520, 966, 346, 227, 543, 7, 318, 768, 50, 65, 132, 1000, 67, 4, 174, 182, 923, 528, 780, 686, 452, 227, 35, 776, 353, 596, 474, 509, 985, 216, 557, 713, 366, 84, 85, 246, 283, 875, 736, 49, 296, 544, 463, 565, 430, 480, 689, 816, 650, 698, 118, 429, 114, 351, 391, 45, 167, 478, 759, 124, 569, 181, 100, 531, 608, 914, 132, 444, 533, 334, 982, 944, 937, 641, 92, 558, 913, 836, 374, 422, 719, 582, 425, 710, 146, 545, 814, 240, 482, 495, 991, 104, 399, 389, 57, 128, 79, 701, 744, 572, 267, 957, 232, 704, 176, 718, 890, 995, 538, 409, 530, 685, 392, 619, 127, 781, 113, 358, 183, 558, 48, 829, 951, 974, 388, 107, 707, 145, 274, 328, 270, 232, 685, 400, 838, 388, 767, 240, 990, 368, 757, 231, 68, 981, 402, 939, 224, 406, 124, 460, 633, 357, 656, 521, 858, 153, 576, 284, 185, 570, 77, 768, 838, 989, 986, 934, 262, 208, 351, 42, 893, 238, 584, 977, 418, 647, 780, 163, 200, 516, 676, 300, 104, 648, 224, 963, 208, 438]
[1, 3, 4, 4, 5, 7, 7, 10, 11, 12, 12, 12, 12, 13, 13, 16, 17, 18, 20, 20, 20, 20, 21, 21, 25, 27, 28, 29, 29, 30, 31, 31, 33, 34, 35, 36, 36, 37, 37, 40, 40, 41, 42, 42, 43, 43, 43, 43, 45, 45, 45, 45, 46, 48, 48, 48, 49, 50, 50, 50, 52, 52, 55, 55, 56, 56, 57, 57, 59, 61, 61, 63, 65, 67, 68, 69, 69, 70, 72, 73, 75, 75, 75, 75, 77, 77, 78, 78, 79, 79, 84, 84, 85, 86, 87, 89, 89, 90, 92, 92, 92, 92, 93, 94, 94, 96, 97, 99, 100, 100, 100, 102, 104, 104, 104, 107, 107, 107, 110, 110, 111, 112, 112, 113, 114, 115, 117, 118, 121, 124, 124, 124, 126, 126, 127, 127, 128, 129, 130, 132, 132, 132, 133, 133, 134, 136, 137, 138, 139, 142, 144, 145, 145, 146, 146, 146, 148, 149, 151, 151, 153, 156, 156, 157, 158, 160, 161, 161, 163, 164, 165, 165, 165, 166, 167, 167, 168, 169, 171, 173, 174, 174, 176, 177, 177, 177, 178, 178, 178, 181, 182, 182, 182, 182, 183, 183, 183, 185, 185, 185, 185, 186, 186, 187, 188, 188, 190, 190, 190, 194, 200, 201, 201, 203, 206, 206, 208, 208, 209, 210, 211, 216, 216, 217, 221, 224, 224, 224, 224, 227, 227, 228, 228, 229, 230, 230, 231, 231, 232, 232, 233, 234, 235, 237, 237, 238, 238, 240, 240, 243, 244, 245, 246, 246, 249, 250, 251, 251, 253, 255, 256, 256, 257, 257, 258, 260, 261, 261, 262, 263, 264, 265, 266, 266, 267, 267, 267, 268, 269, 269, 269, 270, 270, 272, 272, 273, 273, 274, 274, 275, 276, 276, 277, 277, 278, 278, 280, 281, 283, 284, 290, 290, 291, 291, 292, 293, 295, 295, 295, 296, 296, 296, 300, 300, 303, 304, 304, 307, 308, 308, 310, 311, 314, 315, 317, 318, 319, 320, 324, 324, 327, 327, 328, 328, 328, 329, 329, 330, 331, 333, 333, 334, 334, 334, 338, 338, 338, 340, 342, 342, 344, 344, 344, 346, 347, 348, 349, 351, 351, 351, 351, 353, 357, 358, 359, 359, 359, 361, 363, 363, 365, 366, 366, 366, 368, 368, 370, 370, 371, 372, 372, 373, 374, 374, 375, 377, 377, 378, 380, 380, 382, 383, 384, 384, 384, 385, 385, 388, 388, 388, 388, 389, 389, 390, 391, 391, 392, 392, 393, 393, 394, 397, 399, 399, 400, 400, 400, 401, 401, 402, 402, 403, 404, 406, 408, 408, 409, 409, 410, 410, 414, 416, 416, 416, 418, 418, 418, 421, 422, 424, 424, 424, 425, 428, 428, 428, 429, 429, 430, 432, 433, 435, 435, 436, 436, 436, 437, 437, 438, 438, 439, 440, 442, 442, 444, 445, 445, 447, 448, 448, 450, 452, 454, 456, 460, 461, 463, 463, 464, 464, 464, 467, 467, 468, 470, 471, 471, 472, 474, 474, 474, 475, 476, 477, 478, 478, 479, 480, 480, 482, 482, 482, 486, 487, 489, 492, 493, 493, 494, 494, 495, 496, 496, 497, 497, 497, 497, 498, 498, 502, 502, 504, 504, 504, 505, 506, 507, 508, 509, 511, 511, 513, 514, 515, 515, 515, 516, 517, 517, 517, 518, 518, 520, 521, 521, 523, 524, 525, 525, 526, 526, 527, 528, 528, 530, 531, 531, 532, 532, 533, 535, 536, 537, 538, 538, 539, 540, 541, 542, 542, 542, 542, 543, 544, 544, 545, 546, 547, 548, 549, 550, 550, 550, 551, 552, 555, 555, 556, 556, 557, 557, 558, 558, 559, 560, 561, 564, 565, 565, 566, 566, 567, 568, 568, 569, 570, 570, 572, 572, 574, 574, 576, 577, 577, 580, 580, 580, 581, 582, 584, 585, 585, 586, 587, 587, 588, 588, 590, 591, 595, 595, 596, 599, 601, 604, 604, 605, 607, 608, 608, 610, 612, 613, 617, 617, 619, 619, 619, 620, 620, 623, 625, 627, 632, 632, 633, 633, 635, 636, 639, 641, 642, 646, 647, 648, 648, 648, 650, 653, 654, 654, 656, 656, 658, 658, 661, 662, 662, 664, 666, 667, 667, 669, 669, 669, 673, 676, 677, 679, 681, 685, 685, 686, 687, 688, 689, 690, 691, 694, 694, 695, 698, 698, 698, 698, 699, 700, 701, 701, 702, 702, 704, 704, 705, 705, 706, 706, 707, 707, 710, 710, 711, 713, 713, 713, 713, 714, 714, 714, 715, 716, 716, 717, 718, 718, 719, 719, 719, 720, 722, 724, 724, 725, 726, 727, 728, 731, 733, 736, 737, 739, 740, 740, 741, 742, 744, 746, 747, 749, 750, 752, 752, 752, 752, 753, 753, 756, 756, 757, 757, 757, 757, 759, 759, 764, 764, 765, 765, 766, 767, 767, 768, 768, 768, 771, 773, 773, 774, 775, 775, 776, 776, 778, 779, 780, 780, 780, 781, 781, 783, 785, 786, 789, 789, 790, 792, 792, 793, 794, 797, 805, 808, 809, 814, 814, 814, 815, 816, 816, 819, 820, 821, 821, 821, 823, 823, 824, 824, 825, 826, 826, 826, 826, 828, 829, 829, 835, 836, 837, 837, 837, 838, 838, 840, 841, 842, 844, 847, 848, 849, 849, 851, 853, 853, 853, 858, 858, 858, 860, 861, 864, 864, 867, 868, 868, 869, 870, 871, 872, 872, 874, 874, 874, 875, 876, 876, 877, 882, 883, 884, 885, 886, 886, 886, 887, 887, 889, 889, 890, 890, 891, 891, 891, 892, 892, 893, 895, 896, 897, 897, 901, 901, 903, 904, 905, 905, 907, 910, 910, 913, 914, 915, 916, 917, 918, 918, 918, 918, 919, 920, 920, 921, 923, 924, 925, 925, 928, 928, 928, 929, 930, 933, 933, 933, 933, 934, 935, 936, 936, 937, 937, 937, 937, 939, 939, 940, 943, 944, 944, 946, 946, 951, 951, 952, 952, 952, 952, 954, 956, 957, 958, 959, 959, 963, 963, 964, 964, 964, 964, 965, 965, 965, 966, 967, 973, 974, 975, 976, 977, 977, 980, 981, 981, 982, 984, 985, 986, 986, 989, 990, 990, 990, 991, 993, 995, 995, 997, 998, 999, 1000]

Process finished with exit code 0

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值