Java-list,快速排序

Java-list,快速排序

学海无涯,回头就忘!
而立之年开始学习java,各位加油!

场景描述

对一个list的内容,按照字母(或者数字)进行排序(一,如果是数字,用int大小对比;二,如果是字母String,可以取第一位转为char,进行大小对比,本文以此为例;三,如果是汉字,可以取汉字第一位并转为拼音,在参考二的方式对比,四,如果是自定义类别,同理只需在调换位置时注意即可)

(本文算法参考于https://www.cnblogs.com/hjy9420/p/5032309.html)

下方代码,以字母list为例,并在代码中做关键点描述:

代码块

import java.util.List;
import java.util.ArrayList;

public class FastSort{

    public static void main(String []args){

        List list = new ArrayList<>();
        list.add("sdf");
        list.add("xerwr");
        list.add("cf");
        list.add("qx");
        list.add("z");
        list.add("werh");

        int start = 0;
        int end = list.size()-1;
        //调用sort方法,排序
        sort(list,start,end);
        //循环输出排序后的list内容,看是否正确
        for(int i = 0; i < list.size(); i ++){
            System.out.println(list.get(i));
        }
    }
    public static void sort(List list, int low, int high){
    //start是list的第一位,end是list的最后一位,start和end都是list的坐标;
        int start = low;
        int end = high;
        //value作为参考值,取未排序的list第一位value的首字母作为参考
        //下方的算法大体思路,就是拿list的第一位和value比较,排序,
        //value值前都比value小,value值后都比value大
        char value = list.get(low).charAt(0);

        //char valueStart = list.get(start).charAt(0);
        //char valueEnd = list.get(end).charAt(0);

        while(end>start){
            //从后往前比较
            //list.get(end).charAt(0)是list最后一个值的首字母
            while(end>start && list.get(end).charAt(0)>= key) {
                end--;
            }
            if(list.get(end).charAt(0)<=key){
                //此时list第一位和最后一位需要调换位置,先将list第一位的值保存起来
                String keyStarts = list.get(start);
                //此处调换位置,使用list的set方法,由于第一位放入了最后一个值,
                //所以最后一位需要放入之前的第一位的值
                list.set(start, list.get(end));
                list.set(end, keyStarts);
            }
            //从前往后比较
            while(end>start && list.get(start).charAt(0)<=key) start++;
            if(list.get(start).charAt(0)>=key){
                // 同理从后往前比较,需要将第一位的值先保存,方便调换
                String keyStarts = list.get(start);
                list.set(start, list.get(end));
                list.set(end, keyStarts);
            }

        if(start>low) sort(list, low, start-1);
        if(end1, high);
    }
}

执行结果

cf
qx
sdf
werh
xerwr
z

难点说明

  1. 该算法的理解,这是核心问题,明白两次while是为什么
  2. list的set方法,这是学习点,不懂的搜一下资料,非常方便
  3. 除了这些简单的list,这种方式也可以排序自定义类别的list,思路一样,只是在调换位置的时候稍加注意即可

你可能感兴趣的:(Java)