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;
    }
    
  • 相关阅读:
    Eclipse汉化后怎么改回英文版 (中文 改 英文)
    解决android中Layout文件下的xml文件配好后,R类中不能自动生成相应代码
    Android SDK离线安装
    Windows环境下Android Studio v1.0安装教程
    Eclipse调试Bug的七种常用技巧
    博客开通了
    Android常见的按钮监听器实现方式
    用setTimeout实现在DOM上(通常是菜单栏)鼠标停留一段时间才执行相应的操作
    Javascript模块模式学习分享
    Oracle数据库逻辑存储结构管理
  • 原文地址:https://www.cnblogs.com/gallien/p/14319910.html
Copyright © 2011-2022 走看看