作者:caocao(网络隐士),http://www.caocao.name,http://www.caocao.mobi
转载请注明来源:http://caocao.iteye.com/blog/123721
对于某些只读的HTML collection来说,普通排序方法无法对其进行排序,于是隐士想到了编写一个增强版的JavaScript版快速排序程序。该排序除了接收可读写的一个数组外,还接收一个实现了compare, swap接口的变量。可读写的数组由调用者根据只读collection生成,具体的交换过程在swap中由用户自行实现,这样可以改善系统提供的排序的局限性。至于debug接口,可以选择不实现,在不实现debug的情况下,不会造成排序性能损失。
java 代码
- var sortContainer=
- {
- compare: function(v1, v2)
- {
- if (v1==v2)
- return 0;
- else if (v1<v2)
- return -1;
- else
- return 1;
- },
- swap: function(i1, i2)
- {
- },
- debug: function(message)
- {
- document.getElementById("DebugDiv").innerHTML+=message+"<br/>";
- }
- }
- function quickSort(a, container)
- {
- if (a==null)
- return;
- var length=a.length;
- if (length<2)
- return;
- function internalQuickSort(lowIndex, highIndex, a, container)
- {
- if (lowIndex<highIndex)
- {
- var pos=internalPartition(lowIndex, highIndex, a, container);
- internalQuickSort(lowIndex, pos-1, a, container);
- internalQuickSort(pos+1, highIndex, a, container);
- }
- }
- function internalPartition(lowIndex, highIndex, a, container)
- {
- var pivot=a[lowIndex];
- var lowI=lowIndex;
- var highI=highIndex;
- while (true)
- {
- do {lowI++;} while (container.compare(a[lowI], pivot)<0);
- while (container.compare(a[highI], pivot)>0) {highI--;}
- if (lowI>=highI) break;
- var tmp=a[lowI];
- a[lowI]=a[highI];
- a[highI]=tmp;
- container.swap(lowI, highI);
- if (container.debug) container.debug("* "+lowI+"("+a[highI]+") -> "+highI+"("+a[lowI]+") ["+a.join(",")+"]");
- }
- if (lowIndex!=highI)
- {
- a[lowIndex]=a[highI];
- a[highI]=pivot;
- container.swap(lowIndex, highI);
- if (container.debug) container.debug(lowIndex+"("+a[highI]+") -> "+highI+"("+a[lowIndex]+") ["+a.join(",")+"]");
- }
- return highI;
- }
- if (container.debug) container.debug("["+a.join(",")+"]");
- internalQuickSort(0, length-1, a, container);
- if (container.debug) container.debug("["+a.join(",")+"]");
- }
- var a=new Array(1,3,8,2,4,6,5,7,40,35,67,82,23,31,2,3,45);
- quickSort(a, sortContainer);