Java实现快速排序及用快排思想实现剑指Offer45题

快速排序

//思想
//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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值