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;
    }
    
  • 相关阅读:
    SetThreadAffinityMask设置线程亲缘性
    Delphi 获取北京时间(通过百度和timedate网站)
    delphi 实现微信开发
    翻书的效果:FMX.TSwipeTransitionEffect Animation
    [每日一题] OCP1z0-047 :2013-07-15 drop column
    Delphi获取当前系统时间(使用API函数GetSystemTime)
    Delphi代码中嵌入ASM代码
    Delphi Jpg和Gif转Bmp
    Delphi RichEdit的内容保存为图片
    Delphi 实现任务栏多窗口图标显示
  • 原文地址:https://www.cnblogs.com/gallien/p/14319910.html
Copyright © 2011-2022 走看看