How to create pagination for users list using custom array?

<?php 

        global $wp_query;

        $topuser = array();

        $avatar_size = 100;

        $args = array(
            'role__in'     => array('contributor', 'author'),
            'hide_empty'     => '1'
         ); 
        $users = get_users( $args );

        foreach ( $users as $user ) {    

            $query = get_posts( array('author' => $user->ID, 'cat' => '3', 'numberposts' => -1, 'post_type'  => 'post' ));
            $counter = 0;

            $post_count = count_user_posts( $user->ID );

            if ( ! $post_count ) {
                continue;
            }

            // get each post of a user
            foreach ( $query as $post ){
                $views = absint( get_post_meta( $post->ID, 'post_views_count', true ));
                $counter += $views;
            }
            $topuser[] = array( 
            'id' => $user->ID,
            'views' => $counter
            );
            wp_reset_query();
        }

        // function to sort array based on views count
        function sortViews($a, $b) {
            return $b['views'] - $a['views'];
        }
        usort($topuser, 'sortViews'); // sort the array





        $rank = 0;

        // Update rank of each user before pagination
        foreach ($topuser as $user){
           $rank++;
           update_user_meta( $user['id'], 'user_rank', $rank );
        }



        // Pagination 
        $page = ! empty( $_GET['pg'] ) ? (int) $_GET['pg'] : 1;
        $total = count( $topuser ); //total items in array    
        $limit = 20; //per page    
        $totalPages = ceil( $total/ $limit ); //calculate total pages
        $page = max($page, 1); //get 1 page when $_GET['pg'] <= 0
        $page = min($page, $totalPages); //get last page when $_GET['pg'] > $totalPages
        $offset = ($page - 1) * $limit;
        if( $offset < 0 ) $offset = 0;



        // Get users from array for current page
        $topuser = array_slice( $topuser, $offset, $limit );

        //$rank=$offset;
        $rankpostcount=$offset;

        echo '<div id="top-artists-contributors">';

        foreach ($topuser as $user){

           //$rank++;
           $rankpostcount++;

            $query = get_posts( array('author' => $user['id'], 'cat' => '3', 'numberposts' => -1, 'post_type'  => 'post' ));
            $avatar = get_avatar($user['id'], $avatar_size);
            $author_profile_url = get_author_posts_url($user['id']);
            $profile = get_userdata($user['id']);

            // get updated rank for each user
            $rank = get_user_meta( $user['id'], 'user_rank', true );

            if (count($query)) {

                echo '<div class="rankpostcount-'.$rankpostcount.' single-item-9">';

                echo '<div class="members-name-9"><a href="', $author_profile_url, '">' . $profile->first_name .'</a><div class="author-rank-9" title="Artist Rank">'.$rank.'</div></div>';

                echo '</div>';         
            }
        }

        echo '</div>';
    }

    $link = get_the_permalink().'?pg=%d';
    $pagerContainer="<div style="width: 300px;">";   
    if( $totalPages != 0 ) 
    {
      if( $page == 1 ) 
      { 
        $pagerContainer .= ''; 
      } 
      else 
      { 
        $pagerContainer .= sprintf( '<a href="' . $link . '" style="color: #c00"> &#171; prev page</a>', $page - 1 ); 
      }
      $pagerContainer .= ' <span> page <strong>' . $page . '</strong> from ' . $totalPages . '</span>'; 
      if( $page == $totalPages ) 
      { 
        $pagerContainer .= ''; 
      }
      else 
      { 
        $pagerContainer .= sprintf( '<a href="' . $link . '" style="color: #c00"> next page &#187; </a>', $page + 1 ); 
      }           
    }                   
    $pagerContainer .= '</div>';

    echo $pagerContainer;
    ?>