/*快排(重写比较方法)(O(nlogn),O(1))
  快排思想:
  1.先从队尾开始向前扫描且当low < high时,如果a[high] > pivot,则high–,但如果a[high] < pivot,
  则将high的值赋值给low,即arr[low] = a[high],同时要转换数组扫描的方式,即需要从队首开始向队尾进行扫描了
  2.同理,当从队首开始向队尾进行扫描时,如果a[low] < pivot,则low++,但如果a[low] > pivot了,
  则就需要将low位置的值赋值给high位置,即arr[low] = arr[high],同时将数组扫描方式换为由队尾向队首进行扫描.
  3.不断重复1和2,直到low=high时,low或high的位置就是该基准数据在数组中的正确索引位置.

  重写比较方法:
  不是直接比较两个数a、b的大小,而是比较a、b的拼接结果ab和ba的大小,若ab<ba则a排在b的前面
 */
public String PrintMinNumber(int [] numbers) {
    if (numbers == null || numbers.length == 0) return "";
    quickSort(numbers,0,numbers.length-1);
    StringBuffer sb = new StringBuffer();
    for (int number : numbers) {
        sb.append(number);
    }
    return sb.toString();
}

public void quickSort(int[] numbers,int low,int high) {
    if (low >= high) return;
    int pivot = numbers[low];
    int originalLow = low;
    int originalHigh = high;
    while (low < high){
        while (low < high){
            if (compare(numbers[high],pivot) < 0){
                numbers[low] = numbers[high];
                low++;
                break;
            }
            high--;
        }
        while (low < high){
            if (compare(numbers[low],pivot) > 0) {
                numbers[high] = numbers[low];
                high--;
                break;
            }
            low++;
        }
    }
    numbers[low] = pivot;
    quickSort(numbers,originalLow,low - 1);
    quickSort(numbers,low + 1,originalHigh);
}
//重写比较方法
public int compare(int a,int b){
    //a、b的拼接结果ab和ba可能会超过int的最大范围,因此比较它们的大小需要通过比较字符串的大小
    String str1 = a + "" + b;
    String str2 = b + "" + a;
    return str1.compareTo(str2);//源码其实就是从左到右比较每一个数位的大小
}