1306. Sorting Algorithm

版权声明:本文为博主原创文章,转载需标注来源。 https://blog.csdn.net/Code_Mart/article/details/78394638

null

题解:

水题一道,写个堆排序练练手。
今天上数据结构课,老师问了一个问题:实际应用中,快速排序为何比堆排序应用更加广泛?答案:堆排比较的几乎都不是相邻元素,对cache极不友好,这才是很少被采用的原因。

Code:

#include <iostream>
#include <stdio.h>
using namespace std;
void swap_m(int & a,int & b)
{
    int tmp = b;
    b = a;
    a = tmp;
}
void heap_sort(int i,int * s,int last)
{
    int L = 2*i, R = 2*i+1;
    if (L>last&&R>last) return ;
    int Max_LR = -1;
    if (R<=last&&L>last) Max_LR = R;
    if (L<=last&&R>last) Max_LR = L;
    if (R<=last&&L<=last) Max_LR = (s[L]<s[R])?R:L;
    if (s[Max_LR]>s[i])
        {
            swap_m(s[Max_LR],s[i]);
            heap_sort(Max_LR, s, last);
        }
}
int main()
{
    int N,I;

    while(scanf("%d%d",&N,&I)&&(N!=0||I!=0))
    {
        int * s = new int [N+1];
        s[0] = N;
        for (int i = 1;i<=N;i++) scanf("%d",&s[i]);
        for (int i = N/2;i>=1;i--)
            heap_sort(i,s,N);
        for (int i = N;i>=1;i--)
        {
            swap_m(s[i], s[1]);
            heap_sort(1, s, i-1);
        }
        //for(int i =1;i<=N;i++)
          //  printf("%d ",s[i]);
        for (int i = 1;i<=N;i+=I)
            if (i==1) printf("%d",s[i]);
                else printf(" %d",s[i]);
        printf("\n");
    }
    //printf("\n");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Code_Mart/article/details/78394638