• Groupon面经Prepare: Sort given a range && Summary: Bucket Sort


    首先是如何sort一个只有0和1的数组,要求inplace. follow up是告诉一个range,如何在O(N)时间内sort好

    两个pointer可解

     1 package Sorting;
     2 import java.util.*;
     3 
     4 public class InplaceSorting {
     5     public void sorting(int[] arr) {
     6         if (arr==null || arr.length==0) return;
     7         int l=0, r=arr.length-1;
     8         while (l < r) {
     9             while (l<r && arr[l]==0) {
    10                 l++;
    11             }
    12             while (l<r && arr[r]==1) {
    13                 r--;
    14             }
    15             if (l == r) return;
    16             swap(arr, l, r);
    17         }
    18     }
    19     
    20     public void swap(int[] arr, int l, int r) {
    21         int temp = arr[l];
    22         arr[l] = arr[r];
    23         arr[r] = temp;
    24     }
    25     
    26 
    27     /**
    28      * @param args
    29      */
    30     public static void main(String[] args) {
    31         // TODO Auto-generated method stub
    32         InplaceSorting sol = new InplaceSorting();
    33         int[] arr = new int[]{0,1,1,0,1,0,0,1};
    34         sol.sorting(arr);
    35         System.out.println(Arrays.toString(arr));
    36     }
    37 
    38 }

    BucketSort可解

    Best case performance: O(n + k), where k is the size of buckets or the range between min and max in original array

    Worst case performance: O(n^2)

    Aver case performance: O(n + k)

    Worst case space: O(n*k)

    BucketSort works as follows:

    1. set up an array of initially empty buckets(should know the range)

    2. Go over the original array, put each object in its bucket

    3. Sort each non-empty bucket.

    4. visit the buckets in order and put all elements back into the original array.

     1 package Sorting;
     2 
     3 import java.util.Arrays;
     4 
     5 public class Solution {
     6     public void bucketSort(int[] arr, int min, int max) {
     7         int[] bucket = new int[max-min+1];
     8         for (int elem : arr) {
     9             bucket[elem-min]++;
    10         }
    11         int cur = 0;
    12         for (int i=0; i<bucket.length; i++) {
    13             while (bucket[i] > 0) {
    14                 arr[cur++] = i+min;
    15                 bucket[i]--;
    16             }
    17         }
    18     }
    19 
    20     /**
    21      * @param args
    22      */
    23     public static void main(String[] args) {
    24         // TODO Auto-generated method stub
    25         Solution sol = new Solution();
    26         int[] arr = new int[]{5,6,9,10,4,11,5,7,6,11};
    27         sol.bucketSort(arr, 4, 11);
    28         System.out.println(Arrays.toString(arr));
    29     }
    30 
    31 }
  • 相关阅读:
    C# comboBox实现省市两级联动(winform)
    Alter用法
    封装SQLHelper
    杨中科版C#射击游戏
    C# TXT文件导入至数据库
    C# 手机号码归属地查询
    C#中从数据库导出至txt
    解决C#中txt文档导入数据库时,中文显示乱码的问题
    第一篇博文与技术无关 纯瞎扯
    全国省市数据库
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/5180855.html
Copyright © 2020-2023  润新知