7.2选择排序、堆排序

一、前置排序:选择排序

时间复杂度O(N^2);

void SelectSort(int A[], int n)
{
    for (int j = 0; j < n - 1; j++)
    {
        int min = j; //确定最小元素位置
        for (int i = j + 1; i < n; i++)
        {
            if (A[min] > A[i])
                A[min] = A[i];
            min = i;
        }
        //判断条件容易丢
        if (min! = i)
            swap(A[i], A[min]);
    }
}

二、堆排序的构建

本质特点是一棵完全二叉树,分为大根堆与小根队

1.建立大根堆

// 1.建立大根堆
void BuildMaxHeap(int A[], int len)
{
    for (int i = len / 2; i > 0; i--)
    //从后往前调整所有非终端结点
    {
        HeadAjust(A, i, len); //一次大根堆,摆好一次数据
    }
}

//将以K为根的子树调整为大根堆
void HeadAdjust(int A[], int k, int len)
{
    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; //重点是这一步,修改k值z,这里k要重新处理
        }
    }
    A[k] = A[0]; //被筛选结点的值放入最终位置
}

2.基于堆排序进行排序

void HeapSort(int A[], int len)
{
    BuildMaxHeap(int A[], int len);
    for (int i = len; i > 1; i--)
    {
        swap(A[i], A[1]);
        HeadAdjust(int A[], int k, int len);
    }
}

3.时间复杂度分析
时间复杂度
建立堆,关键字对比次数,不超过4n,时间复杂度 O(n),复杂算的
关键字对比,O(h)
排序时间复杂度O(nlogn)
总体上不稳定

三.堆排序的插入与删除

插入:与父节点进行交换比较,交换后的节点再与父节点交换比较,直至符合条件为止

删除:把表尾节点交给删除节点的位置,然后往下比较进行符合堆排序条件的交换,直至符合条件为止

考点再与步骤和比较次数

你可能感兴趣的:(Alogrithm,java,算法,数据结构)