快速排序
//思想
//1.先从数列中取出一个数作为基准数。
//2.将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
//3.再对左右区间重复第二步,直到各区间只有一个数。
public class QuickSort {
public static void main(String[] args) {
int [] a ={6,15,2,7,9,3,4,5,10,88};
int [] b=quicksort(a,0,a.length-1);
System.out.println(Arrays.toString(b));
}
public static int[] quicksort(int[] arr,int low,int high){
if (low>high) return arr;
int i=low,j=high,t;
int temp=arr[low];
while (i<j) {
while (i < j && temp <=arr[j]) { //在数组后面找比基准值小的
j--;
}
while (i < j && temp >= arr[i]) { //在数组前面找比基准值大的
i++;
}
if (i < j) { //交换这两个数
t = arr[j];
arr[j] = arr[i];
arr[i] = t;
}
} //找完退出循环此时i=j
arr[low]=arr[i]; //将基准为与i和j相等位置的数字交换
arr[i]=temp;
quicksort(arr, low, j-1);//递归调用左半数组
quicksort(arr,j+1,high); //递归调用右半数组
return arr;
}
}
剑指offer45题(本文用快排解决)
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
示例 1:
输入: [10,2]
输出: “102”
示例 2:
输入: [3,30,34,5,9]
输出: “3033459”
//思想:
//如果x+y>y+x(x和y都是字符串),那么x"大于"y,即x应该放在y的右边
//如果x+y<y+x(x和y都是字符串),那么x"小于"y,即x应该放在y的左边
class Solution {
public String minNumber(int[] nums) {
String[] arr = new String[nums.length];
for (int i = 0; i < nums.length; i++) {
arr[i] = String.valueOf(nums[i]);
}
quickSort(arr, 0,arr.length - 1);
StringBuilder res = new StringBuilder();
for (String s : arr)
res.append(s);
return res.toString();
}
public String[] quickSort(String[] arr, int low, int high) {
if (low>high) return arr ;
int i=low,j=high;
String t;
String temp=arr[low];
while (i<j) {
while (i < j&&(arr[j] + temp).compareTo(temp + arr[j]) >= 0){//从后面找比基准值“小”的
j--;
}
while (i< j&&(arr[i] + temp).compareTo(temp + arr[i]) <=0){//从前面找比基准值“大”的
i++;
}
if (i < j) { //交换这两个数
t = arr[j];
arr[j] = arr[i];
arr[i] = t;
}
} //找完退出循环此时i=j
arr[low]=arr[i]; //将基准为与i和j相等位置的数字交换
arr[i]=temp;
quickSort(arr, low, j-1);//递归调用左半数组
quickSort(arr,j+1,high); //递归调用右半数组
return arr;
}
}