package com.alibaba.interview;
import java.util.Random;
/**
* @Author: weblee
* @Email: likaiweb@163.com
* @Blog: http://www.cnblogs.com/lkzf/
* @Time: 2014年10月25日下午2:58:39
*
************* function description ***************
*一个整型数组中各元素排列组合得到的最大的一个数 ,比如,1,3,9,11,23,233,911 要得到:9,911,3,233,23,11,1
****************************************************
*
*solution:
* ①确定该数组array中数字最长的数字,得到最长len
* ②new 等长的数组doArray,存放处理之后的原数组(角标pos与值对应关系不变),how to 处理,将所有的数追加末尾数字c变为等长(len),
* ③对doArray 快速排序,同步交换 doArray、array的 角标对应的数字 swap(int[] doArray, int i, int j, int[] array)
*
* 时间O(nlog(n)),空间O(n)
*/
public class FirstSort {
public static void sort(int[] array) {
int max = 0;
for (int i = 1; i < array.length; i++) {
if (max < array[i])
max = array[i];
}
int len = (max + "").length();
int[] doArray = new int[array.length];
for (int i = 0; i < array.length; i++) {
doArray[i] = doNum(array[i], len);
}
quickSort(doArray, 0, doArray.length - 1, array);
}
private static Random rand = new Random();
/**
* 快速排序法
*/
private static void quickSort(int[] a, int p, int r, int[] num) {
while (p < r) {
int q = randomPartition(a, p, r, num);
quickSort(a, p, q - 1, num);
p++;
}
}
private static int partition(int[] a, int p, int r, int[] num) {
int x = a[p];
int i = p - 1;
for (int j = p; j <= r; j++) {
if (a[j] >= x) {
i++;
swap(a, i, j, num);
}
}
swap(a, p, i, num);
return i;
}
private static int randomPartition(int[] a, int p, int r, int[] num) {
int i = rand.nextInt(r - p) + p;
swap(a, p, i, num);
return partition(a, p, r, num);
}
private static void swap(int[] a, int i, int j, int[] num) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
//
temp = num[i];
num[i] = num[j];
num[j] = temp;
}
static int doNum(int num, int len) {
StringBuffer buffer = new StringBuffer(num + "");
char c = buffer.charAt(buffer.length() - 1);
int bit = buffer.length();
while (bit != len) {
buffer.append(c);
bit++;
}
return Integer.parseInt(buffer.toString());
}
// 输出方法,因为sort是按照从小到大的进行排序的,所以要Display方法处理一下
public static void display(int[] L) {
for (int i : L) {
System.out.print(i + "\t");
}
}
/**
* @param args
*/
public static void main(String[] args) {
int[] arr = { 1, 3, 9, 11, 23, 233, 911 };
sort(arr);
display(arr);
}
}