@@ -1950,38 +1950,59 @@ public static List sort(List arr, Object comparator) {
19501950 return arr ;
19511951 }
19521952
1953- List result = new ArrayList <>(arr );
19541953
19551954 if (comparator != null ) {
1956- Comparator comp = new Comparator () {
1957-
1958- @ Override
1959- public int compare (Object o1 , Object o2 ) {
1960- try {
1961- Boolean swap = toBoolean (funcApply (comparator , Arrays .asList (o1 , o2 )));
1962- if (swap == null )
1963- return 0 ;
1964- if (swap )
1965- return 1 ;
1966- else
1967- return -1 ;
1968- } catch (Throwable e ) {
1969- // TODO Auto-generated catch block
1970- //e.printStackTrace();
1971- throw new RuntimeException (e );
1972- }
1973- }
1974-
1975- };
1976- if (comparator instanceof Comparator )
1977- result .sort ((Comparator )comparator );
1978- else
1979- result .sort ((Comparator )comp );
1980- } else {
1981- result .sort (null );
1955+ if (comparator instanceof Comparator ) {
1956+ List sorted = new ArrayList <>(arr );
1957+ sorted .sort ((Comparator ) comparator );
1958+ return sorted ;
1959+ }
1960+
1961+ Object [] sorted = arr .toArray ();
1962+ Object [] buffer = new Object [sorted .length ];
1963+ mergeSort (sorted , buffer , 0 , sorted .length - 1 , comparator );
1964+ List result = new ArrayList <>(sorted .length );
1965+ Collections .addAll (result , sorted );
1966+ return result ;
19821967 }
19831968
1984- return result ;
1969+ List sorted = new ArrayList <>(arr );
1970+ sorted .sort (null );
1971+ return sorted ;
1972+ }
1973+
1974+ private static void mergeSort (Object [] sorted , Object [] buffer , int lo , int hi , Object jsonataComparator ) {
1975+ if (lo >= hi ) {
1976+ return ;
1977+ }
1978+ int mid = (lo + hi ) / 2 ;
1979+ mergeSort (sorted , buffer , lo , mid , jsonataComparator );
1980+ mergeSort (sorted , buffer , mid + 1 , hi , jsonataComparator );
1981+ merge (sorted , buffer , lo , mid , hi , jsonataComparator );
1982+ }
1983+
1984+ private static void merge (Object [] sorted , Object [] buffer , int lo , int mid , int hi , Object jsonataComparator ) {
1985+ int i = lo , j = mid + 1 , k = lo ;
1986+
1987+ while (i <= mid && j <= hi ) {
1988+ boolean swap ;
1989+ try {
1990+ Boolean sw = toBoolean (funcApply (jsonataComparator , Arrays .asList (sorted [i ], sorted [j ])));
1991+ swap = Boolean .TRUE .equals (sw );
1992+ } catch (Throwable e ) {
1993+ throw new RuntimeException (e );
1994+ }
1995+
1996+ if (swap ) {
1997+ buffer [k ++] = sorted [j ++];
1998+ } else {
1999+ buffer [k ++] = sorted [i ++];
2000+ }
2001+ }
2002+ while (i <= mid ) buffer [k ++] = sorted [i ++];
2003+ while (j <= hi ) buffer [k ++] = sorted [j ++];
2004+
2005+ System .arraycopy (buffer , lo , sorted , lo , hi - lo + 1 );
19852006 }
19862007
19872008 /**
0 commit comments