C语言实现十大算法之堆排序算法《二》

参考内容
时间关系,本文见最上方参考内容,这里不过多赘述,仅做自己笔记使用

堆排序算法

一、概念
  • 堆----> 是基本的数据结构,就是利用完全二叉树来维护一组数据
  • **完全二叉树---->**叶节点只能出现在最下层和次下层,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树,举例如图:
    C语言实现十大算法之堆排序算法《二》_第1张图片
    就是酱紫的。
  • 大白话说:就是最后一层可以不满且都在左边,其它层都满了
  • 分类:大顶堆、小顶堆,就是根节点是最大最小的情况来分类的。
  • 每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆
  • 算法思想
    • 先将排序的数组构造成一个大根堆,这个时候整个数组的最大值就是堆结构的顶端,也就是数组下标为0的位置
    • 将顶端的数与末尾的数交换,此时,末尾的数为最大值,剩余待排序数组个数为n-1
    • 将剩余的n-1个数继续执行上面两个操作,最后就得到排序的数组
二、图解
  • 数据准备C语言实现十大算法之堆排序算法《二》_第2张图片
  • 对于数组查找:
    • 父结点索引:(i-1)/2
    • 2.左孩子索引:2*i+1
    • 3.右孩子索引:2*i+2
  • 见最上方参考内容,这里不过多赘述,仅做自己笔记使用
三、代码实现

大根堆

#include
#include

int temp, n;
int a[100];

/*
    int[] a = {8, 12, 20, 1, 5, 58, 85, 25, 13};
*/
void swap(int a[], int i, int j) {
    int temp = a[i];
    a[i] = a[j];
    a[j] = temp;
}

void heapify(int a[], int index, int size) {
    int left = 2 * index + 1;
    int right = 2 * index + 2;
    while (left < size) {
        int largestIndex;
        if (a[left] < a[right] && right < size) {
            largestIndex = right;
        } else {
            largestIndex = left;
        }
        if (a[index] > a[largestIndex]) {
            largestIndex = index;
        }
        if (index == largestIndex) {
            break;
        }
        swap(a, largestIndex, index);
        index = largestIndex;
        left = 2 * index + 1;
        right = 2 * index + 2;
    }
}

void heapInsert(int a[]) {
    for (int i = 0; i < n; i++) {
        int currentIndex = i;
        int fatherIndex = (currentIndex - 1) / 2;
        while (a[currentIndex] > a[fatherIndex]) {
            swap(a, currentIndex, fatherIndex);
            currentIndex = fatherIndex;
            fatherIndex = (currentIndex - 1) / 2;
        }
    }
}

void heapSort(int a[]){

    heapInsert(a);//实现一个大根堆
    int size= n;
    while( size > 1){
        swap(a, 0, size-1);
        size--;
        heapify(a, 0, size);
    }
}


int main(){
    scanf("%d", &n);
    for( int i = 0; i < n; i++)
        scanf( "%d", &a[i] );
    heapSort(a);
    for( int i = 0; i < n; i++)
        printf( "%d ", a[i] );
}

你可能感兴趣的:(算法)