Java实现——把正整数数组的元素拼成一个最小的数

来源:互联网 发布:曼秀雷敦洗面奶 知乎 编辑:程序博客网 时间:2024/06/03 19:01

转自几个面试经典算法题(http://www.cnblogs.com/sunniest/p/4596182.html)题目四


这个算法的思想和快速排序的思想相似。先把第一个元素p当作中间数,数组前后各有一个索引begin、end。先从后索引对应元素e起,如果ep>pe或e=p,那么后索引往前移动,直到后索引等于前索引,或ep<pe。交换e、p元素。再从前索引对应元素b起,如果pb>bp或b=p,那么前索引后移,直到前索引等于后索引或pb<bq,交换p、b。这时,“小于”p的都在p左边(这里小于的意思是,两个数a、b拼成一个数时,a小于b指ab<ba),“大于”p的都在p右边(这里大于的意思是,两个数a、b拼成一个数时,a大于b指ab>ba)。再对p的两边子数组各自进行递归处理。

//数组组成的最小数import java.util.Arrays;public class MinNumberFromArray {private void swap(int[] array , int m , int n){int t = array[m];array[m] = array[n];array[n] = t;}public boolean isMBiggerThanN(int m , int n){String s1 = String.valueOf(m);String s2 = String.valueOf(n);int i = Integer.valueOf(s1 + s2);int j = Integer.valueOf(s2 + s1);if(i > j){return true;}else{return false;}}public int partition(int[] array , int left , int right){int partition = array[left];while(left < right){while(left < right && (partition == array[right] ||  isMBiggerThanN(array[right] , partition))){right--;}swap(array , left , right);while(left < right && (partition == array[left] || isMBiggerThanN(partition , array[left]))){left++;}swap(array , left , right);}return left;}public void qsort(int[] array , int left , int right){if(left < right){int position = partition(array , left , right);qsort(array , left , position - 1);qsort(array , position + 1 , right);}}public static void main(String[] args) {MinNumberFromArray m = new MinNumberFromArray();int[] a = {2 , 11 , 5 , 52};m.qsort(a, 0, a.length - 1);System.out.println(Arrays.toString(a));}}


阅读全文
0 0
原创粉丝点击