zoukankan      html  css  js  c++  java
  • 算法-快速排序

    虽然现在很多语言对不同数据结构都封装好了排序方法,但是不同的应用场景中总会用到一些没有现成排序算法的数据结构,这时就要求程序员能够快速手写排序算法。

    基于List<Map>实现的快速排序算法。

      现有一个List<Map>的引用 list,要求根据list.get(i).get("value")的值来进行排序,即根据Map的某一字段对List排序

      

    private List<Map> QuickSort(List<Map> list, String sortKey, int left,int right)
    {
        return quick_sort(list,sortKey,left,right);
    }
    
    private List<Map> quick_sort(List<Map> list, String sortKey, int left,int right)
    {
        if(left < right)
        {
            Map key = list.get(left);
            int low = left;
            int high = right;
            while(low < high)
            {
                while(low < high && list.get(high).get(sortKey) >= key.get(sortKey))
                {
                    high--;
                }
                list.set(low,list.get(high));
                while(low < high && list.get(low).get(sortKey) <= key.get(sortKey))
                {
                    low++;
                }
                list.set(high,list.get(low));
            }
            list.set(low,key);
            List<Map> listSortLeft = quick_sort(list,sortKey,left,low-1);
            List<Map> listSortRight = quick_sort(listSortLeft ,sortKey,low+1,right);
            return listSortRight;
        }
        return list;
    }

     上述实现是基于java语言,由于java中方法参数传递只有值传递的一种,所以在向QuickSort方法中传递list参数实际上传递的是list的值,但是因为list本身是一个引用(除了基本八类型之外其他的变量都是引用变量,只不过一些引用变量如String被封装成了不可变类(实际的内存区域的值不可被改变)),所以list的值就是一个地址,所以就是把这个地址赋值给了一个新的引用,但是新的引用指向的内存区域还是原来的真的的数据存放内存区域,所以在方法体中对list的赋值操作是会改变它的值的,所以其实不用加上返回值类型直接用void也可以实现排序。 请看以下代码

    import antlr.collections.Stack;
    import com.sun.tools.xjc.reader.xmlschema.bindinfo.BIConversion;
    import org.apache.xmlbeans.impl.xb.xsdschema.Public;
    
    import java.security.PublicKey;
    import java.util.ArrayList;
    import java.util.List;
    
    public class FunctionParam {
        public static void main(String[] args)
        {
            int a = 41;
            func1(a);
            System.out.println(a);
            String ss= "11";
            func2(ss);
            System.out.println(ss);
            People people = new People("mingzi");
            func3(people);
            System.out.println(people.name);
            List list = new ArrayList();
            list.add("1");
            func4(list);
            System.out.println(list.toString());
        }
        public static void func1(int i){
            i++;
        }
        public static void func2(String ss){
            ss = ss+"0000";
        }
        public static void func3(People people){
            people.setName("shy");
        }
        public static void func4(List list){
            list.add("add");
        }
    
    }
    class People
    {
        public String name;
        public People(String name){
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }

    输出结果

    41
    11
    shy
    [1, add]

    其中基本类型 int 型的变量没有被改变,是因为function的参数传递是值传递。

    Sring类型的变量没有改变是因为,虽然Sring是一个引用,但是JAVA中的String类型被封装成一个特殊的不变类,给String赋值的时候会默认新开一片内存区域将右值copy一份再存入新的String引用,而方法参数传递也是一种赋值操作。

    之后的People和List类由于其本身是引用,所以在参数传递时就如同引用传递

  • 相关阅读:
    弹框在UC浏览器或者Android机器上会被顶上去
    移动端性能优化
    当placeholder的字体大小跟input大小不一致,placeholder垂直居中
    Chrome下面查看placeholder的样式
    js 高级程序设计(笔记)
    SpringBoot自定义配置步骤
    二叉树的下一个节点
    输入某二叉树的前序遍历和中序遍历的结果,重建出该二叉树
    kafka配置记录
    Builder模式
  • 原文地址:https://www.cnblogs.com/Theshy/p/7488006.html
Copyright © 2011-2022 走看看