zoukankan      html  css  js  c++  java
  • 堆排序

    堆排序

      堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。
    既然是堆排序,自然需要先建立一个堆,而建堆的核心内容是调整堆,使二叉树满足堆的定义(每个节点的值都不大于其父节点的值)。接下来就是调堆和循环调堆,具体参见堆排序

    参考代码

    C语言

    /* 版本一 */
    #include<stdio.h>
    #include<stdlib.h>
     
    void swap(int*a,int*b)
    {
        int temp;
        temp=*a;
        *a=*b;
        *b=temp;
    }
    void select_sort(int A[],int n)
    {
        register int i,j,min,m;
        for(i=0;i<n-1;i++)
        {
            min=i;//查找最小值
            for(j=i+1;j<n;j++)
            {
                if(A[min]>A[j])
                {
                    min=j;
                }
            }
            if(min!=i)
            {
                swap(&A[min],&A[i]);
                printf("第%d趟排序结果为:
    ",i+1);
                for(m=0;m<n;m++)
                {
                    if(m>0)
                    {
                        printf("");
                    }
                    printf("%d",A[m]);
                }
                printf("
    ");
            }
        }
    }
    int main(void)
    {
        int n;
        while(scanf("%d",&n)!=EOF)    /* VS2013等版本中需使用scanf_s(),VC6.0中使用scanf() */
        {
            int i;
            int*A=(int*)malloc(sizeof(int)*n);
            for(i=0;i<n;i++)
            {
                scanf("%d",&A[i]);
            }
            select_sort(A,n);
            printf("最终排序结果为:
    ");
            for(i=0;i<n;i++)
            {
                if(i>0){
                    printf("");
                }
                printf("%d",A[i]);
            }
            printf("
    ");
        }
        return 0;
    }
     
     
     
    /* 版本二 */
    #include <stdio.h>
    #include <math.h>
     
    #define MAX_SIZE 101
    #define SWAP(x, y, t)  ((t) = (x), (x) = (y), (y) = (t))
     
    void sort(int[], int);      /* selection sort */
     
    void main(void)
    {
        int i, n;
        int list[MAX_SIZE];
        printf("Enter the number of numbers to generate: ");
        scanf_s("%d", &n);
        if (n < 1 || n > MAX_SIZE){
            fprintf(stderr, "Improper value of n
    ");
            exit(1);
        }
        for (i = 0; i < n; i++){    /* randomly generate numbers */
            list[i] = rand() * 1000;
            printf("%d ", list[i]);
        }
        sort(list, n);
        printf("
     Sorted array:
    ");
        for (i = 0; i < n; i++)    /* print out sorted numbers */
            printf("%d ", list[i]);
        printf("
    ");
    }
     
     
    void sort(int list[], int n)
    {
        int i, j, min, temp;
        for (i = 0; i < n - 1; i++){
            min = i;
            for (j = i + 1; j < n; j++)
            if (list[j] < list[min])
                min = j;
            SWAP(list[i], list[min], temp);
        }
    }

    C#

    static void(int[]group)
    {
        int temp;
        int pos=0;
        for(int i=0;i< group.Length-1;i++)
        {
            pos=i;
            for(intj=i+1;j<group.Length;j++)
            {
                if(group[j]<group[pos])
                {
                    pos=j;
                }
            }//第i个数与最小的数group[pos]交换
            temp=group[i];
            group[i]=group[pos];
            group[pos]=temp;
        }
    }

    C

    void select_sort(int*a,int n)
    {
        register int i,j,min,t;
        for(i=0;i<n-1;i++)
        {
            min=i;//查找最小值
            for(j=i+1;j<n;j++)
                if(a[min]>a[j])
                    min=j;//交换
            if(min!=i)
            {
                t=a[min];
                a[min]=a[i];
                a[i]=t;
            }
        }
    }

    c++

    #include<iostream>
    #include<time.h>
    #include<iomanip>
    using namespace std;
    const int N=10;
    int main()
    {
        int a[N],i,j,temp,b;
        srand(time(NULL));
        for(i=0;i<N;i++)
            a[i]=rand()%100;
        for(i=0;i<N;i++)
            cout<<setw(3)<<a[i];
        cout<<endl;
        for(i=0;i<N-1;i++)
        {
            temp=i;
            for(j=i+1;j<N;j++)
            {
                if(a[temp]>a[j])
                    temp=j;
            }
            if(i!=temp)
            {
                b=a[temp];
                a[temp]=a[i];
                a[i]=b;}
        }
        for(i=0;i<N;i++)
            cout<<setw(3)<<a[i];
        cout<<endl;
    }
  • 相关阅读:
    Python接口测试实战5(下)
    Python接口测试实战4(上)
    Python接口测试实战3(下)- unittest测试框架
    Python接口测试实战3(上)- Python操作数据库
    Python接口测试实战2
    Python接口测试实战1(下)- 接口测试工具的使用
    Python接口测试实战1(上)- 接口测试理论
    python+request+Excel做接口自动化测试
    Android软件测试Monkey测试工具
    Python循环语句
  • 原文地址:https://www.cnblogs.com/rinack/p/5015428.html
Copyright © 2011-2022 走看看