zoukankan      html  css  js  c++  java
  • leetcode-剑指40-OK

    address

    // 低效率算法
    int* getLeastNumbers(int* arr, int arrSize, int k, int* returnSize){
    ////排序算法
        int partition(int *mm,int low, int high){
            int pivot = mm[low];
            while (low <high){
                while(low <high && mm[high] >=pivot)   high--;
                mm[low] = mm[high];
                while(low <high && mm[low] <= pivot)   low++;
                mm[high] = mm[low];
            }
            mm[low] = pivot;
            return low;
        }
        void paixu(int *mm, int start, int end){
            int pivot = partition(mm,start,end);
            if (start < pivot-1) paixu(mm, start, pivot-1);
            if (end > pivot+1) paixu(mm, pivot+1, end);
        }
    //////////////////
        returnSize[0] = k;
        if(k == 0)
            return arr;
        int *a = (int *) malloc(sizeof(int) * k);
        int i = 0;
        int j;
        for(i = 0; i< k; i++)
            a[i] = arr[i];
        paixu(a,0,k-1);
        for(i = k; i<arrSize; i++){
            if(arr[i]<a[k-1]){  //找到位置插进去
                for(j = k-2; j >=0;j--){
                    if(arr[i]<a[j]){
                        a[j+1] = a[j];
                    }else{
                        break;
                    }
                }
                a[j+1] = arr[i];
            }
        }
        return a;
    }
    
    
    // 直接快排,效率还行
    int* getLeastNumbers(int* arr, int arrSize, int k, int* returnSize){
    ////排序算法
        int partition(int *mm,int low, int high){
            int pivot = mm[low];
            while (low <high){
                while(low <high && mm[high] >=pivot)   high--;
                mm[low] = mm[high];
                while(low <high && mm[low] <= pivot)   low++;
                mm[high] = mm[low];
            }
            mm[low] = pivot;
            return low;
        }
        void paixu(int *mm, int start, int end){
            int pivot = partition(mm,start,end);
            if (start < pivot-1) paixu(mm, start, pivot-1);
            if (end > pivot+1) paixu(mm, pivot+1, end);
        }
    //////////////////
        returnSize[0] = k;
        if(k == 0)
            return arr;
        paixu(arr,0,arrSize-1);
        return arr;
    }
    
    // 使用堆排序
    // 每次把最小的推到堆顶,搞k次
    // 效率比较高
    int* getLeastNumbers(int* arr, int arrSize, int k, int* returnSize){
        returnSize[0] = k;
        if(k == 0)
            return arr;
        int mid[k+1];
        for(int i = 0; i<k; i++)
            mid[i+1] = arr[i];
    // 堆调整以及建堆的函数
        void head_adjust(int arr[], int k, int size_adjust){
            arr[0] = arr[k];
            int i;
            for (i=2*k ; i <= size_adjust ; i*=2){
                if (i+1<= size_adjust && arr[i] <arr[i+1])
                    i +=1;
                if (arr[0]>= arr[i])
                    break;
                else{
                    arr[k] = arr[i];
                    k = i;
                }
            }
            arr[k] = arr[0];
        }
    
        void build_max_heap(int *arr, int size){
            for (int i= size/2; i>0; i--){
                head_adjust(arr, i, size);
            }
        }
    //--------------------------------------------------
        build_max_heap(mid,k);
        for(int i =k; i<arrSize; i++){
            if(arr[i]<mid[1]){
                mid[1] = arr[i];
                head_adjust(mid,1,k);
            }
        }
        for(int i = 0; i<k; i++)
            arr[i] = mid[i+1];
        return arr;
    }
    
  • 相关阅读:
    oracle锁表查询,资源占用,连接会话,低效SQL等性能检查
    oracle临时表
    oracle列转行
    oracle数据库查询重复记录
    查找mysql的cnf文件位置
    Nginx反向代理,负载均衡,redis session共享,keepalived高可用
    Linux 软件安装
    Linux上网设置
    c#学习内容
    PHP八大设计模式
  • 原文地址:https://www.cnblogs.com/gallien/p/14319910.html
Copyright © 2011-2022 走看看