zoukankan      html  css  js  c++  java
  • 堆排序的实现

    代码+注释:

    #include <stdio.h>
    #define N 10000
    int num[N], a[N];

    void heap_adjust(int x, int y)
    {
    int i = x, tmp = num[x];
    int j = i<<1; //j左移一位,即i*2
    while(j <= y) //当未超过堆底时
    {
    if(j < y && num[j+1] < num[j]) j++; //如果右孩子比左孩子小,j++
    if(tmp > num[j]) //升序
    {
    num[i]
    = num[j];
    i
    = j;
    j
    = i<<1;
    }
    else break;
    }
    num[i]
    = tmp; //将num[x]补到相应的位置
    }

    int main()
    {
    int i, n;
    scanf(
    "%d", &n);
    for(i = 1; i <= n; i++)
    scanf(
    "%d", num+i);
    for(i = n/2; i >= 0; i--) heap_adjust(i, n); //将原数组num[]做一次堆排序,构成一个小根堆
    int m = n;
    i
    = 0;
    while(n--)
    {
    a[
    ++i] = num[1]; //将当前堆顶元素存到其他数组里
    num[1] = num[n+1]; //删掉堆顶元素
    heap_adjust(1, n); //重新进行一次堆排序,找到最小元素,放在堆顶
    }
    for(i = 1; i <= m; i++)
    printf(
    "%d ", a[i]); //将排好序的序列输出
    printf("\n");
    return 0;

    }
  • 相关阅读:
    图片音乐 上传、下载
    表格类型数据,Excel csv导入,导出操作
    逐行读取txt文件,分割,写入txt。。。上传,下载
    性能分析四
    性能分析三
    postman断言
    postman+Newman语法参数
    shell_03
    shell_02
    shell_01
  • 原文地址:https://www.cnblogs.com/vongang/p/2115420.html
Copyright © 2011-2022 走看看