• 7-1 排序 (25 分)


    题意:

    对给出的数字按由小到大进行排序。

    思路:

    之前一直没有用过堆排序,借这个题练习一下堆排序。

    堆排序:

    时间复杂度:

    最好情况:O(nlogn)

    平均情况:O(nlogn)

    最坏情况:O(nlogn)

    空间复杂度:O(1)

    是否稳定:

    代码:

    #include <bits/stdc++.h>
    #define inf 0x3f3f3f3f
    #define MAX 1e9;
    #define FRE() freopen("in.txt","r",stdin)
    using namespace std;
    typedef long long ll;
    typedef pair<int, int> P;
    const int maxn = 1000000;
    int n;
    int heap[maxn];
    
    void adjustHeap(int parent,int length){
        int temp = heap[parent];//保存父亲节点的值,因为后边会进行交换
        int child = parent*2;
        while(child<=length){//对以这个节点为根的整棵子树进行调整
            if(child<length && heap[child+1]>heap[child]){//如果是右子树的值更大的话
                child++;//将child的值,定位到右子树的下标
            }
            if(heap[child]<temp){//如果是根节点的值大于孩子节点中的最大值就结束
                break;
            }
            heap[parent] = heap[child];//进行交换
            parent = child;
            child = parent*2;
        }
        heap[parent] = temp;
    }
    
    void heapSort(){
        for(int i = n/2; i>0; i--){//从树的中间开始进行调整,因为中间位置就可以调整到整棵树的节点
            adjustHeap(i, n);
        }
    
        for(int i = n; i>1; i--){
            swap(heap[1], heap[i]);//每一次都会得出一个值,从小到大排序,就将他放到还没有确定好的序列的最后一位
            adjustHeap(1,i-1);
        }
        for(int i = 1; i<=n; i++){
            if(i!=1){
                printf(" ");
            }
            printf("%d",heap[i]);
        }
    
    }
    
    int main(){
        scanf("%d",&n);
        for(int i = 1; i<=n; i++){
            scanf("%d",&heap[i]);
        }
        heapSort();
        return 0;
    }
    堆排序
    #include <bits/stdc++.h>
    #define inf 0x3f3f3f3f
    #define MAX 1e9;
    #define FRE() freopen("in.txt","r",stdin)
    using namespace std;
    typedef long long ll;
    typedef pair<int, int> P;
    const int maxn = 1000000;
    int n,a[maxn],t[maxn];
    
    void mergeArray(int st,int en,int mid,int* buf,int* temp){
        int i = st,j = mid+1;
        int k = 0;
        while(i<=mid && j<=en){//将该递归下的数组排序
            if(buf[i] < buf[j]){
                temp[k++] = buf[i++];
            }else{
                temp[k++] = buf[j++];
            }
        }
        while(i<=mid){
            temp[k++] = buf[i++];
        }
        while(j<=en){
            temp[k++] = buf[j++];
        }
        for(int p = 0; p<k; p++){//将排好序的序列再赋值到原来的位置
            buf[st+p] = temp[p];
        }
    }
    
    void mergeSort(int* buf,int st,int en,int* temp){
        if(st < en){
            int mid = (st+en)/2;
            mergeSort(buf, st, mid, temp);//向左递归分割
            mergeSort(buf, mid+1, en, temp);//向右递归分割
            mergeArray(st,en,mid,buf,temp);//合并数组
        }
    }
    
    
    int main(){
        scanf("%d",&n);
        for(int i = 0; i<n; i++){
            scanf("%d",&a[i]);
        }
        mergeSort(a,0,n-1,t);
        for(int i=0; i<n; i++){
            if(i){
                printf(" ");
            }
            printf("%d",a[i]);
        }
        return 0;
    }
    归并排序
  • 相关阅读:
    P2572 [SCOI2010]序列操作
    python学习笔记2
    嗯,python
    ETROBOT——审题
    条件编译
    第三章单片机简介
    模拟输入输出
    arduino库函数1
    arduino相关文献阅读
    Arduino的小灯亮起来~~~
  • 原文地址:https://www.cnblogs.com/sykline/p/10080393.html
Copyright © 2020-2023  润新知