zoukankan      html  css  js  c++  java
  • 【HackerRank】QuickSort(稳定快排,空间复杂度O(n))

    QuickSort

    In the previous challenge, you wrote a partition method to split an array into 2 sub-arrays, one containing smaller elements and one containing larger elements. This means you 'sorted' half the array with respect to the other half. Can you repeatedly use partition to sort an entire array?

    Guideline
    In Insertion Sort, you simply went through each element in order and inserted it into a sorted sub-array. In this challenge, you cannot focus on one element at a time, but instead must deal with whole sub-arrays, with a strategy known as "divide and conquer".

    When partition is called on an array, two parts of the array get 'sorted' with respect to each other. If partition is then called on each sub-array, the array will now be split into 4 parts. This process can be repeated until the sub-arrays are small. Notice that when partition is called on just two numbers, they end up being sorted.

    Can you repeatedly call partition so that the entire array ends up sorted?

    Print Sub-Arrays
    In this challenge, print your array every time your partitioning method finishes, i.e. print every sorted sub-array The first element in a sub-array should be used as a pivot. Partition the left side before partitioning the right side. The pivot should not be added to either side. Instead, put it back in the middle when combining the sub-arrays together.

    Input Format
    There will be two lines of input:

    • n - the size of the array
    • ar - the n numbers of the array

    Output Format
    Print every partitioned sub-array on a new line.

    Constraints
    1<=n<=1000
    -1000<=x<= 1000 , x ∈ ar
    There are no duplicate numbers.


    题解:多用O(n)的空间实现Partition函数。不过感觉更清晰。

    代码如下:

     1 import java.util.*;
     2 public class Solution {
     3        
     4     static int partition(int[] ar,int start,int end) {
     5         ArrayList<Integer> smaller = new ArrayList<Integer>();
     6         ArrayList<Integer> bigger = new ArrayList<Integer>();
     7         int pivot = ar[start];
     8         for(int i = start+1;i < end;i++){
     9             if(ar[i] <= pivot)
    10                 smaller.add(ar[i]);
    11             else 
    12                 bigger.add(ar[i]);            
    13         }
    14       
    15         int i = 0;
    16         for(i = 0;i<smaller.size();i++)
    17             ar[start+i] = smaller.get(i);
    18         ar[start+i] = pivot; 
    19         int p = start+i;
    20         for(;i-smaller.size()<bigger.size();i++)
    21             ar[start+i+1] = bigger.get(i-smaller.size());
    22         
    23         return p;
    24         
    25     }
    26        static void quickSort(int[] ar,int start,int end) {
    27            if(start >= end - 1)
    28                return;
    29            int p = partition(ar,start,end);
    30            quickSort(ar, start, p);
    31            quickSort(ar, p+1, end);
    32            printArray(ar, start, end);
    33        }   
    34  
    35       static void printArray(int[] ar,int start,int end) {
    36          StringBuffer sb = new StringBuffer();
    37          for(int i = start;i < end;i++)
    38              sb.append(ar[i]).append(" ");
    39          System.out.println(sb.toString());
    40       }
    41        
    42       public static void main(String[] args) {
    43            Scanner in = new Scanner(System.in);
    44            int n = in.nextInt();
    45            int[] ar = new int[n];
    46            for(int i=0;i<n;i++){
    47               ar[i]=in.nextInt(); 
    48            }
    49            quickSort(ar,0,ar.length);
    50        }    
    51    }
  • 相关阅读:
    App唤起微信小程序和回调
    微信小程序 — 自定义picker选择器弹窗内容+textarea穿透bug
    微信小程序的场景值scene
    微信小程序textarea层级过高(盖住其他元素)
    微信小程序如何修改本地缓存key中的单个数据
    微信小程序---查看更多的显示与隐藏
    微信小程序文字超过行后隐藏并且显示省略号
    Flutter 页面下拉刷新和上拉加载
    json转换成dart类 JSON to Dart
    Flutter 保持页面状态
  • 原文地址:https://www.cnblogs.com/sunshineatnoon/p/3886535.html
Copyright © 2011-2022 走看看