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;

    }
  • 相关阅读:
    codevs 3049 舞蹈家怀特先生
    洛谷P2530 [SHOI2001]化工厂装箱员
    洛谷P2736 “破锣摇滚”乐队 Raucous Rockers
    Phalanx
    Treats for the Cows
    Very Simple Problem
    Alice and Bob
    FatMouse and Cheese
    Tickets
    Piggy-Bank
  • 原文地址:https://www.cnblogs.com/vongang/p/2115420.html
Copyright © 2011-2022 走看看