mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			74 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
/*
 | 
						|
 *  This file is part of the X10 project (http://x10-lang.org).
 | 
						|
 *
 | 
						|
 *  This file is licensed to You under the Eclipse Public License (EPL);
 | 
						|
 *  You may not use this file except in compliance with the License.
 | 
						|
 *  You may obtain a copy of the License at
 | 
						|
 *      http://www.opensource.org/licenses/eclipse-1.0.php
 | 
						|
 *
 | 
						|
 *  (C) Copyright IBM Corporation 2006-2014.
 | 
						|
 */
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 * Straightforward quicksort implementation using
 | 
						|
 * naive partition-in-the-middle and not bothering with
 | 
						|
 * well-known optimizations such as using insertion sort
 | 
						|
 * once the partitions get small.  This is only intended
 | 
						|
 * as a simple example of an array-based program that 
 | 
						|
 * combines a recirsive divide and conquer algorithm 
 | 
						|
 * with async and finish, not as a highly efficient 
 | 
						|
 * sorting procedure..
 | 
						|
 */
 | 
						|
public class QSort {
 | 
						|
 | 
						|
  private static def partition(data:Rail[int], left:long, right:long) {
 | 
						|
      var i:long = left;
 | 
						|
      var j:long = right;
 | 
						|
      var tmp:int;
 | 
						|
      var pivot:long = data((left + right) / 2);
 | 
						|
 | 
						|
      while (i <= j) {
 | 
						|
          while (data(i) < pivot) i++;
 | 
						|
          while (data(j) > pivot) j--;
 | 
						|
          if (i <= j) {
 | 
						|
              tmp = data(i);
 | 
						|
              data(i) = data(j);
 | 
						|
              data(j) = tmp;
 | 
						|
              i++;
 | 
						|
              j--;
 | 
						|
          }
 | 
						|
      }
 | 
						|
 | 
						|
      return i;
 | 
						|
  }
 | 
						|
 | 
						|
  public static def qsort(data:Rail[int], left:long, right:long) {
 | 
						|
      index:long = partition(data, left, right);
 | 
						|
      finish {
 | 
						|
          if (left < index - 1)
 | 
						|
              async qsort(data, left, index - 1);
 | 
						|
 | 
						|
          if (index < right)
 | 
						|
              qsort(data, index, right);
 | 
						|
      }
 | 
						|
  }
 | 
						|
 | 
						|
  public static def main(args:Rail[String]) {
 | 
						|
      val N = args.size>0 ? Long.parse(args(0)) : 100;
 | 
						|
      val r = new x10.util.Random();
 | 
						|
      val data = new Rail[int](N, (long)=>r.nextInt(9999n));
 | 
						|
      qsort(data, 0, N-1);
 | 
						|
      for (i in 0..(N-1)) {
 | 
						|
          Console.OUT.print(data(i)); 
 | 
						|
          if (i%10 == 9) {
 | 
						|
	      Console.OUT.println();
 | 
						|
          } else {
 | 
						|
              Console.OUT.print(", ");
 | 
						|
          }
 | 
						|
      }
 | 
						|
      Console.OUT.println();
 | 
						|
  }
 | 
						|
}
 | 
						|
 |