• 算法导论9.2以期望线性时间做选择


    )M}UNMPAEY)PAYP61@BLT73

    image

    M1OB`15_K0U_B_GGB1(LFEA

    #include <stdint.h>
    #include <time.h>
    #include <iostream>
    #ifdef __linux
    #include <stdio.h>
    #include <stdlib.h>
    #endif
    
    void swap(int64_t* A, uint64_t i, uint64_t j)
    {
        int64_t tmp = A[i];
        A[i] = A[j];
        A[j] = tmp;
    }
    
    int64_t partition(int64_t* A, int64_t p, int64_t r)
    {
        int64_t x = A[r];
        int64_t i = p;
        for (int64_t j = p; j < r; j++)
        {
            if (A[j] <= x)
            {
                swap(A, i, j);
                i++;
            }
        }
        swap(A, i, r);
        return i;
    }
    
    int64_t RandomizedPartition(int64_t* A, int64_t p, int64_t r)
    {
        int64_t i = (rand() % (r - p)) + p;
        swap(A, i, r);
        return partition(A, p, r);
    }
    
    // RANDOMIZED-SELECT(A, p, r, i)
    // if p == r
    //     return A[p]
    // q = RANDOMIZED-PARTITION(A, p, r)
    // k = q - p + 1
    // if i == k
    // return A[q]
    // else if i < k
    //     return RANDOMIZED-SELECT(A, p, q - 1, i)
    // else
    //     return RANDOMIZED-SELECT(A, q + 1, r, i - k)
    
    int64_t RandomizedSelect(int64_t* A, int64_t p, int64_t r, int64_t i)
    {
        if (p == r)
        {
            return A[p];
        }
        int64_t q = RandomizedPartition(A, p, r);
        int64_t k = q - p + 1;
        if (i == k)
        {
            return A[q];
        }
        else if (i < k)
        {
            return RandomizedSelect(A, p, q - 1, i);
        }
        else
        {
            return RandomizedSelect(A, q + 1, r, i - k);
        }
    }
    int main()
    {
        int64_t array[] = { 2, 8, 7, 1, 3, 5, 6, 4 };
        
        std::cout << RandomizedSelect(array, 0, 7, 3) << std::endl;
        getchar();
        return 0;
    }
    
    BIN     = bin
    FMCSA   = find_max_crossing_subarray
    IAS     = IA_solution
    IST     = insertion_sort_t
    LMSA    = liner_time_max_subarray
    MERGE   = merge
    MERGE_T = merge_t
    VMS     = violate_max_subarray
    STRA    = 4.2_strassen
    COUNT_SORT = 8.2_counting_sort
    MINIMUMMAXIMUM = 9.1_MinimumMaximum
    RS = 9.2_RandomizedSelect
    RQ = 7.3_RandomizedQuicksort
    QS = 7.1_quicksort
    
    CFLAGS = -g -Wall
    
    all : ${BIN}/${COUNT_SORT} ${BIN}/${RS} ${BIN}/${QS} ${BIN}/${FMCSA} ${BIN}/${RQ} ${BIN}/${IAS} ${BIN}/${IST} ${BIN}/${LMSA} ${BIN}/${MERGE} ${BIN}/${MERGE_T} ${BIN}/${VMS} ${BIN}/${STRA} ${BIN}/${MINIMUMMAXIMUM}
    
    ${BIN}/${COUNT_SORT} : ${COUNT_SORT}/counting_sort.cpp
    	g++ ${COUNT_SORT}/counting_sort.cpp ${CFLAGS} -o ${BIN}/${COUNT_SORT}
    
    ${BIN}/${FMCSA} : ${FMCSA}/main.cpp ${FMCSA}/max_sub_array.h
    	g++ ${FMCSA}/main.cpp ${CFLAGS} -o ${BIN}/${FMCSA}
    
    ${BIN}/${IAS} : ${IAS}/insertion_sort.cpp ${IAS}/insertion_sort.h
    	g++ ${IAS}/insertion_sort.cpp ${CFLAGS} -o ${BIN}/${IAS}
    
    ${BIN}/${IST} : ${IST}/${IST}.cpp ${IST}/${IST}.h
    	g++ ${IST}/${IST}.cpp ${CFLAGS} -o ${BIN}/${IST}
    
    ${BIN}/${LMSA} : ${LMSA}/Source.cpp
    	g++ ${LMSA}/Source.cpp ${CFLAGS} -o ${BIN}/${LMSA}
    
    ${BIN}/${MERGE} : ${MERGE}/${MERGE}.cpp  ${MERGE}/${MERGE}.h
    	g++ -std=c++0x ${MERGE}/${MERGE}.cpp ${CFLAGS} -o ${BIN}/${MERGE}
    
    ${BIN}/${MERGE_T} : ${MERGE_T}/${MERGE_T}.cpp  ${MERGE_T}/${MERGE_T}.h
    	g++ -std=c++0x ${MERGE_T}/${MERGE_T}.cpp ${CFLAGS} -o ${BIN}/${MERGE_T}
    
    ${BIN}/${VMS} : ${VMS}/Source.cpp
    	g++ ${VMS}/Source.cpp ${CFLAGS} -o ${BIN}/${VMS}
    
    ${BIN}/${STRA} : ${STRA}/strassen.cpp ${STRA}/strassen.h
    	g++ -std=c++0x ${STRA}/strassen.cpp ${CFLAGS} -o ${BIN}/${STRA}
    
    ${BIN}/${MINIMUMMAXIMUM} : ${MINIMUMMAXIMUM}/${MINIMUMMAXIMUM}.cpp
    	g++ ${MINIMUMMAXIMUM}/${MINIMUMMAXIMUM}.cpp ${CFLAGS} -o ${BIN}/${MINIMUMMAXIMUM}
    	
    ${BIN}/${RS} : ${RS}/${RS}.cpp
    	g++ ${RS}/${RS}.cpp ${CFLAGS} -o ${BIN}/${RS}
    
    ${BIN}/${RQ} : ${RQ}/${RQ}.cpp
    	g++ ${RQ}/${RQ}.cpp ${CFLAGS} -o ${BIN}/${RQ}
    	
    ${BIN}/${QS} : ${QS}/${QS}.cpp ${QS}/${QS}.h
    	g++ ${QS}/${QS}.cpp ${CFLAGS} -o ${BIN}/${QS}
    
    clean:
    	rm ${BIN}/*
    

    rdn_4eb5de1ea06f1

    rdn_4eb5de215ff73

    rdn_4eb5de22051f3

  • 相关阅读:
    4500 小Q系列故事——屌丝的逆袭
    HDU 1171 Big Event in HDU
    linux库文件 /usr/lib
    HDU 1860 统计字符
    编程之美~~传话游戏
    HDU 1087 Super Jumping! Jumping! Jumping!
    HDU 1203 I NEED A OFFER!
    各种树
    HDU 3127 WHUgirls
    01背包 完全背包 多重背包 二维费用背包
  • 原文地址:https://www.cnblogs.com/sunyongjie1984/p/4283278.html
Copyright © 2020-2023  润新知