牛客網初級班(2)

堆排序

void swap(int arr[],int i,int j){
    int tmp=arr[i];
    arr[i]=arr[j];
    arr[j]=tmp;


}
void heapInsert(int arr[],int index){
    while(arr[index]>arr[(index-1)/2]){
        swap(arr,index,(index-1)/2);
        index=(index-1)/2;
    }
}

void heapify(int arr[],int index,int size){
    int left=index*2+1;
    while(left<size){
        int largest=left+1<size&&arr[left+1]>arr[left]?left+1:left;
        largest=arr[largest]>arr[index]?largest:index;

        if(largest==index){
            break;

        }
        swap(arr,largest,index);
        index=largest;
        left=index*2+1;
    }
}


void heapSort(int arr[],int n){
    if(n==1||n==0)
        return;
    for(int i=0;i<n;i++)
        heapInsert(arr,i);
    int size=n;
    swap(arr,0,--size);
    while(size>0){
        heapify(arr,0,size);
        swap(arr,0,--size);
    }

}

桶排序

void BucketSort(int arr[],int n){
    if(n==1||n==0) return;
    int Max=0;
    for(int i=0;i<n;i++){
        Max=max(Max,arr[i]);
    }
    map<int,int>bucket;
    for(int i=0;i<n;i++){
        bucket[arr[i]]++;
    }
    int i=0;
    for(int j=0;j<bucket.size();j++){
        while(bucket[j]-->0){
            arr[i++]=j;
        }
    }
}

小和問題和逆序對可以用歸併排序解決

一個數組中的相鄰數的最大差值

int bucket(int num,int len,int min,int max){
    return (num-min)*len/(max-min);
}
int maxGap(int num[],int n){
    if(n==1||n==0)
        return 0;
    int Min=INF;
    int Max=0;
    for(int i=0;i<n;i++){
        Min=min(Min,num[i]);
        Max=max(Max,num[i]);
    }
    if(Min==Max){
        return 0;
    }
    bool hasNum[200];
    int maxs[200];
    int mins[200];
    int bid=0;
    for(int i=0;i<n;i++){
        bid=bucket(num[i],n,Min,Max);
        mins[bid]=hasNum[bid]?min(mins[bid],num[i]):num[i];
        maxs[bid]=hasNum[bid]?max(maxs[bid],num[i]):num[i];
        hasNum[bid]=true;
    }
    int res=0;
    int lastMax=maxs[0];
    for(int i=1;i<=n;i++){
        if(hasNum[i]){
            res=max(res,mins[i]-lastMax);
            lastMax=maxs[i];
        }
    }
    return res;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章