我的排序

来源:互联网 发布:什么是淘宝店铺运营 编辑:程序博客网 时间:2024/06/01 09:19

我的排序

第一个: 堆排

知识标签: heap, sort, algorithm


该代码实现了用大顶堆排序、向大顶堆插入元素、删除大顶堆堆顶元素

大顶堆code

#include<iostream>void adjustup(int A[], int k){// 多次向上调整以第k个元素开始的子树,直到符合大顶堆的要求    A[0] = A[k];    int i = k/2;    while(i > 0 && A[i] < A[0])    {        A[k] = A[i];        k = i;        i = k/2;    }    A[k] = A[0];}void adjustDown(int A[], int k, int len){// 向下调整以第k个元素开始的子树,使其符合大顶堆的要求    A[0] = A[k];    for(int i = 2*k; i <= len; i *= 2)    {        if(i < len && A[i] < A[i+1])            ++i;        if(A[0] > A[i])            break;        else        {            A[k] = A[i];            k = i;        }    }    A[k] = A[0];}void buildMaxHeap(int A[], int len){    //从第len/2个元素开始,一直到堆顶元素,向下调整堆,建立大顶堆    for(int i = len/2; i > 0; --i)        adjustDown(A, i, len);}void heapsort(int A[], int len){// 堆排    // 建大顶堆    buildMaxHeap(A, len);    //依次把堆顶元素向数组后放,并向下调整堆,最终得到从小到大的数组    for(int i = len; i > 1; --i)    {        A[1] = A[i] + A[1] - (A[i] = A[1]);        adjustDown(A, 1, i - 1);    }}int main(void){    std::cout << "--------堆排--------" << std::endl;    // A[0]不存储数据,初始化为0    int A1[] = {0, 6, 2, 11, 7, 4, 8};    // A[0]不计算在内,故减1    int len1 = sizeof(A1) / sizeof(int) - 1;    // 对数组中前5个数排序    heapsort(A1, len1);    for(int i = 1; i <= len1; ++i)        std::cout << A1[i] << '\t';    std::cout << '\n' << std::endl;    std::cout << "------在堆尾插入一个元素------" << std::endl;    int A2[] = {0, 6, 2, 11, 7, 4, 8};    int len2 = sizeof(A2) / sizeof(int) - 1;    buildMaxHeap(A2, len2-1);    // 打印大顶堆    std::cout << "插入前的大顶堆: " << std::endl;    for(int i = 1; i < len2; ++i)        std::cout << A2[i] << "\t";    std::cout << std::endl;    //插入第len2个元素    adjustup(A2, len2);    //打印调整好的大顶堆    std::cout << "插入后的大顶堆" << std::endl;    for(int i = 1; i <= len2; ++i)        std::cout << A2[i] << '\t';    std::cout << '\n' << std::endl;    std::cout << "-----------删除堆顶最大元素-----------" << std::endl;    int A3[] = {0, 6, 2, 11, 7, 4, 8};    int len3 = sizeof(A3) / sizeof(int) - 1;    buildMaxHeap(A3, len3);    std::cout << "删除前的大顶堆: " << std::endl;    for(int i = 1; i <= len3; ++i)        std::cout << A3[i] << "\t";    std::cout << std::endl;    //把堆顶元素和最后一个元素交换,逻辑删除    A3[1] = A3[len3] + A3[1] - (A3[len3] = A3[1]);    adjustDown(A3, 1, len3 - 1);    std::cout << "删除后的大顶堆: " << std::endl;    for(int i = 1; i < len3; ++i)        std::cout << A3[i] << "\t";    std::cout << std::endl;    return 0;}

结果

这里写图片描述

0 0