选择排序(简单选择排序、堆排序)

本文介绍了两种经典的排序算法:简单选择排序和堆排序。选择排序通过遍历数组找到最小元素并交换,而堆排序利用了大根堆的概念,先建立堆然后进行交换调整。这两种方法都是对数组进行排序的有效手段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单选择排序

//简单选择排序
void SelectSort(int A[], int n) {
    for (int i = 0; i < n - 1; i++) {//一共进行i-1趟
        int min = i;//记录最小元素位置
        for (int j = i + 1; j < n; j++) {//在A[i...n-1]中选择最小的元素
            if (A[j] < A[min])
                min = i;//更新最小元素位置
            if (min != i)
                swap(A[min], A[j]);//封装的swap()函数共移动元素3次
        }
    }
}
//交换
void swap(int& a, int& b) {
    int temp = a;
    a = b;
    b = temp;
}

堆排序

//堆排序
//建立大根堆
void BuildMaxHeap(int A[], int len) {
    for (int i = len / 2; i > 0; i--) {//从后往前调整所有非终端结点
        HeadAdjust(A, i, len);
    }
}

void HeadAdjust(int A[], int k, int len) {
    A[0] = A[k];//A[0]暂存子树的根结点
    for (int i = 2 * k; i <= len; i *= 2) {//沿key较大的子结点向下筛选
        if (i < len && A[i] < A[i + 1])
            i++;//取key较大的子结点的下标
        if (A[i] <= A[0])  break;//筛选结束
        else {
            A[k] = A[i];//将A[i]调整到双亲结点上
            k = i;//修改k值,以便继续向下筛选
        }
    }
    A[k] = A[0];//被筛选结点的值放入最终位置
}

//堆排序的完整逻辑
void HeapSort(int A[], int len) {
    BuildMaxHeap(A, len);//初始建堆
    for (int i = len; i > 1; i--) {//n-1趟的交换和建堆过程
        swap(A[i], A[1]);//堆顶元素和堆底元素交换
        HeadAdjust(A, 1, i - 1);//把剩余的待排序元素整理成堆
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值