算法-快速排序
虽然现在很多语言对不同数据结构都封装好了排序方法,但是不同的应用场景中总会用到一些没有现成排序算法的数据结构,这时就要求程序员能够快速手写排序算法。
基于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类由于其本身是引用,所以在参数传递时就如同引用传递