第十六周项目一堆排序

/*   
* Copyright (c)2016,烟台大学计算机与控制工程学院   
* All rights reserved.   
* 文件名称:项目1.cpp   
* 作    者:王晓慧  
* 完成日期:2016年12月16日   
* 版 本 号:v1.0    
*问题描述:验证堆排序,完成测试。 
*输入描述:无   
*程序输出:测试数据   
*/    

#include <stdio.h>  
#define MaxSize 20  
typedef int KeyType;    //定义关键字类型  
typedef char InfoType[10];  
typedef struct          //记录类型  
{  
    KeyType key;        //关键字项  
    InfoType data;      //其他数据项,类型为InfoType  
} RecType;              //排序的记录类型定义  
  
//调整堆  
void sift(RecType R[],int low,int high)  
{  
    int i=low,j=2*i;                        //R[j]是R[i]的左孩子  
    RecType temp=R[i];  
    while (j<=high)  
    {  
        if (j<high && R[j].key<R[j+1].key)  //若右孩子较大,把j指向右孩子  
            j++;                                //变为2i+1  
        if (temp.key<R[j].key)  
        {  
            R[i]=R[j];                          //将R[j]调整到双亲结点位置上  
            i=j;                                //修改i和j值,以便继续向下筛选  
            j=2*i;  
        }  
        else break;                             //筛选结束  
    }  
    R[i]=temp;                                  //被筛选结点的值放入最终位置  
}  
  
//堆排序  
void HeapSort(RecType R[],int n)  
{  
    int i;  
    RecType temp;  
    for (i=n/2; i>=1; i--) //循环建立初始堆  
        sift(R,i,n);  
    for (i=n; i>=2; i--) //进行n-1次循环,完成推排序  
    {  
        temp=R[1];       //将第一个元素同当前区间内R[1]对换  
        R[1]=R[i];  
        R[i]=temp;  
        sift(R,1,i-1);   //筛选R[1]结点,得到i-1个结点的堆  
    }  
}  
  
int main()  
{  
    int i,n=10;  
    RecType R[MaxSize];  
    KeyType a[]= {0,6,8,7,9,0,1,3,2,4,5};//a[0]空闲,不作为关键字  
    for (i=1; i<=n; i++)  
        R[i].key=a[i];  
    printf("排序前:");  
    for (i=1; i<=n; i++)  
        printf("%d ",R[i].key);  
    printf("\n");  
    HeapSort(R,n);  
    printf("排序后:");  
    for (i=1; i<=n; i++)  
        printf("%d ",R[i].key);  
    printf("\n");  
    return 0;  
}  

### 回答1: #include <stdio.h> void max_heapify(int arr[], int start, int end) { // 建立父节点指标和子节点指标 int dad = start; int son = dad * 2 + 1; while (son <= end) { // 子节点指标在范围内才做比较 if (son + 1 <= end && arr[son] < arr[son + 1]) // 先比较两个子节点大小,选择最大的 son++; if (arr[dad] > arr[son]) // 如果父节点大於子节点代表调整完毕,直接跳出函数 return; else { // 否则交换父节点和子节点的值,并继续子节点和孙节点比较 int temp = arr[dad]; arr[dad] = arr[son]; arr[son] = temp; dad = son; son = dad * 2 + 1; } } } void heap_sort(int arr[], int len) { int i; // 初始化,i从最後一个父节点开始调整 for (i = len / 2 - 1; i >= 0; i--) max_heapify(arr, i, len - 1); // 先將第一個元素和已排好元素前一位做交换,再重新調整,直到排序完畢 for (i = len - 1; i > 0; i--) { int temp = arr[0]; arr[0] = arr[i]; arr[i] = temp; max_heapify(arr, 0, i - 1); } } int main() { int arr[10] = {2, 3, 1, 7, 8, 4, 10, 16, 12, 9}; int len = (int) sizeof(arr) / sizeof(*arr); heap_sort(arr, len); int i; for (i = 0; i < len; i++) printf("%d ", arr[i]); printf("\n"); return 0; } ### 回答2: C语言中的堆排序算法如下: #include <stdio.h> // 堆排序函数 void heapSort(int arr[], int n) { // 创建一个最大堆 buildMaxHeap(arr, n); // 从最后一个非叶子节点开始调整堆 for (int i = n - 1; i > 0; i--) { // 将堆顶元素与末尾元素交换 swap(&arr[0], &arr[i]); // 调整堆 heapify(arr, i, 0); } } // 创建最大堆 void buildMaxHeap(int arr[], int n) { // 从最后一个非叶子节点开始向上调整 for (int i = (n / 2) - 1; i >= 0; i--) { heapify(arr, n, i); } } // 调整堆 void heapify(int arr[], int n, int i) { int largest = i; // 假设当前节点为最大节点 int left = 2 * i + 1; // 左子节点 int right = 2 * i + 2; // 右子节点 // 若左子节点大于最大节点,则更新最大节点 if (left < n && arr[left] > arr[largest]) { largest = left; } // 若右子节点大于最大节点,则更新最大节点 if (right < n && arr[right] > arr[largest]) { largest = right; } // 若最大节点不是当前节点,则交换并继续调整 if (largest != i) { swap(&arr[i], &arr[largest]); heapify(arr, n, largest); } } // 交换两个元素的函数 void swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } int main() { int arr[] = { 5, 2, 8, 3, 1 }; int n = sizeof(arr) / sizeof(int); heapSort(arr, n); printf("排序结果:"); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } return 0; } ### 回答3: 堆排序是一种利用最大堆或最小堆数据结构进行排序的算法。下面是C语言实现堆排序的代码: ```c #include <stdio.h> #include <stdlib.h> // 交换两个元素 void swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } // 调整堆 void heapify(int arr[], int n, int i) { int largest = i; // 初始化根节点为最大值 int left = 2 * i + 1; // 左子节点 int right = 2 * i + 2; // 右子节点 // 如果左子节点大于根节点,则更新最大值索引 if (left < n && arr[left] > arr[largest]) largest = left; // 如果右子节点大于最大值,则更新最大值索引 if (right < n && arr[right] > arr[largest]) largest = right; // 如果最大值变化,则交换最大值与根节点,并继续调整堆 if (largest != i) { swap(&arr[i], &arr[largest]); heapify(arr, n, largest); } } // 堆排序 void heapSort(int arr[], int n) { // 构建最大堆 for (int i = n / 2 - 1; i >= 0; i--) heapify(arr, n, i); // 逐个将堆顶元素移动到末尾,并调整堆 for (int i = n - 1; i > 0; i--) { swap(&arr[0], &arr[i]); heapify(arr, i, 0); } } // 打印数组 void printArray(int arr[], int n) { for (int i = 0; i < n; ++i) printf("%d ", arr[i]); printf("\n"); } int main() { int arr[] = { 12, 11, 13, 5, 6, 7 }; int n = sizeof(arr) / sizeof(arr[0]); printf("初始数组:"); printArray(arr, n); heapSort(arr, n); printf("排序后的数组:"); printArray(arr, n); return 0; } ``` 以上代码中,`swap`函数用于交换两个元素的值,`heapify`函数用于调整堆,`heapSort`函数用于构建堆并进行堆排序。`main`函数中给定了一个示例数组,通过调用`heapSort`函数对数组进行排序,最后通过`printArray`函数打印出排序后的结果。输出结果为: ``` 初始数组:12 11 13 5 6 7 排序后的数组:5 6 7 11 12 13 ``` 这段代码实现了堆排序算法的基本逻辑,通过堆数据结构实现了一个稳定且高效的排序算法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值