Day3 排序能不能有助于Two Sum效率呢(简单交换排序)

结合了简单交换排序的 Two Sum。。。 leetcode上超出时间限制

也是,本来就是想减少暴力解决中的循环,排序和排除比target大的部分又用了一个for两层嵌套循环和while循环(我到底图个什么)

下面仅是简单交换排序(新的Two Sum提交就留在leetcode让我羞愧吧)

import java.util.Arrays;

/**
 * @Author:lixici
 * @Date:2020/08/26 22:41 
 */
public class SwapSort {

    // 升序 or 降序(默认升序)
    SortType sortType;

    SwapSort(){
        this.sortType = SortType.ASC;
    }

    SwapSort(SortType sortType){
        this.sortType = sortType;
    }

    /**
     * 简单交换排序(升序)
     * 思路:
     * 从第一个位置开始,
     * 对于每一个位置,与后面的位置逐个比较,当前位置大于后面某位置,则与之交换数值
     * 这样经过第一次循环,最小的数值被交换到了第一个位置
     */

    /*返回第i个位置放置好最终数值的数组*/
    void compareAndSwap(int i, int[] arr){
        int first = arr[i];

        for(int p = i + 1, length = arr.length; p < length; p++){
            int after = arr[p];
            int swapCondition = 0;

            if(sortType.equals(SortType.DESC)){
                swapCondition = after - first;
            }else{
                swapCondition = first - after;
            }

            if(swapCondition > 0){
                arr[i] = after;
                arr[p] = first;
                first = after;// 测试后添加 
                // 目的是找到i位置该放置的值,first代表该值
                // 不断用arr的第i个位置的数值,和后面的值比较
                // 当发生交换时,arr[i]更新(也就是first更新)
                // 这里写成 fitst = arr[i]; 更好理解
            }
        }
    }

    /*对整个数组排序*/
    public void sortArray(int[] arr){
        for(int i = 0,length = arr.length; i < length; i++){
            compareAndSwap(i,arr);
//            System.out.println("第"+(i+1)+"次" + Arrays.toString(arr));
        }
    }

    enum SortType{
        ASC,DESC;
    }

    public static void main(String[] args) {

        int[] arr = {9,8,55,6,34,11,-12,22,99,33,44,55,9,102};

        SwapSort asc = new SwapSort();
        asc.sortArray(arr);
        System.out.println("asc==>" + Arrays.toString(arr));

        SwapSort desc = new SwapSort(SortType.DESC);
        desc.sortArray(arr);
        System.out.println("desc==>" + Arrays.toString(arr));

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值