算法-快速排序

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

基于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类由于其本身是引用,所以在参数传递时就如同引用传递

原文地址:https://www.cnblogs.com/Theshy/p/7488006.html