Advertisement
bekovski

algovi_ppbs_orig

Jul 31st, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.64 KB | None | 0 0
  1. package pivot;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Arrays;
  5. import java.util.List;
  6.  
  7. public class PivotPartitioningByScanning {
  8.    
  9.     // m1 - 1       elements in list are less than pivot
  10.     // m2 - m1      elements are equal to pivot
  11.     // n - m2 + 1   elements greater than pivot (where n = list.size()-1)
  12.     int m1;
  13.     int m2;
  14.    
  15.     // before and after each iteration:
  16.     // 1.   1 <= i1 <= m1 <= i2 <= m2 <= i3 <= n+1
  17.     // 2.   S[j] < pivot for j in (1, ..., i1-1),  if i1 < m1: S[i1] >= pivot
  18.     // 3.   S[j] = pivot for j in (m1, ..., i2-1), if i2 < m2: S[i2] != pivot
  19.     // 4.   S[j] > pivot for j in (m2, ..., i3-1), if i3 <= n: S[i3] <= pivot
  20.     int i1;
  21.     int i2;
  22.     int i3;
  23.    
  24.     public static void main(String[] args) {
  25.         PivotPartitioningByScanning scanner = new PivotPartitioningByScanning();
  26.        
  27.         List<Integer> ints = new ArrayList<>();
  28.         String list = "27 20 24 22 30 25 12 17 15 17 22 23 15 22 18 29 20 23 29 20";
  29.         list = "11 20 19 21 13 15 26 16 29 30 17 11 27 24 18 24 27 24 28 11";
  30.         list = "11 20 19 21 13 19 15";
  31.        
  32.         String[] splits = list.split(" ");
  33.         for(String num : splits) {
  34.             ints.add(Integer.parseInt(num));
  35.         }
  36.        
  37.         System.out.println("length = " + ints.size());
  38.         for(Integer i : ints) {
  39.             System.out.print(i + ", ");
  40.         }
  41.         System.out.println();
  42.        
  43.         scanner.ppbs(ints, 19);
  44.         for(Integer i : ints) {
  45.             System.out.print(i + ", ");
  46.         }
  47.     }
  48.    
  49.    
  50.     // variant: at least one of i1, i2, i3 is increased by at least 1, none of them is decreased
  51.     // break condition: i1 == m1 && i2 == m2 && i3 == n + 1
  52.     private void ppbs(List<Integer> list, int pivot) {
  53.         init(list, pivot);
  54.        
  55.         int iter = 0;
  56.         while(i1 != m1 || i2 != m2 || i3 != list.size()) {
  57.             System.out.print(iter++ + ": ");
  58.             for(Integer i : list) {
  59.                 System.out.print(i + ", ");
  60.             }
  61.             System.out.println();
  62.             // note: for nabla: i1+1, i2+1, i3+1 !!!
  63.             System.out.println("i1 = " + i1);
  64.             System.out.println("i2 = " + i2);
  65.             System.out.println("i3 = " + i3);
  66.             System.out.println();
  67.             System.out.println();
  68.            
  69.             if(i1 < m1) {
  70.                 // TODO
  71.                 if(list.get(i1) == pivot) {
  72.                     swap(list, i1, i2);
  73.                    
  74.                     do {
  75.                         i2++;
  76.                     } while(i2 != m2 && list.get(i2) == pivot);
  77.                 }
  78.                 // S[i1] > p
  79.                 else {
  80.                     swap(list, i1, i3);
  81.                    
  82.                     do {
  83.                         i3++;
  84.                     } while(i3 != list.size() && list.get(i3) > pivot);
  85.                 }
  86.                
  87.                 while(i1 < m1 && list.get(i1) < pivot) {
  88.                     i1++;
  89.                 }
  90.             }
  91.             // i1 == m1
  92.             else {
  93.                 swap(list, i2, i3);
  94.                
  95.                 do {
  96.                     i2++;
  97.                 } while(i2 != m2 && list.get(i2) == pivot);
  98.                
  99.                 do {
  100.                     i3++;
  101.                 } while(i3 != list.size() && list.get(i3) > pivot);
  102.             }
  103.         } // while()
  104.        
  105.         System.out.print(iter++ + ": ");
  106.         for(Integer i : list) {
  107.             System.out.print(i + ", ");
  108.         }
  109.         System.out.println();
  110.         // note: for nabla: i1+1, i2+1, i3+1 !!!
  111.         System.out.println("i1 = " + i1);
  112.         System.out.println("i2 = " + i2);
  113.         System.out.println("i3 = " + i3);
  114.         System.out.println();
  115.         System.out.println();
  116.     } // ppbs()
  117.    
  118.    
  119.     private void init(List<Integer> list, int pivot) {
  120.         m1 = 0;
  121.         for(int j=0; j < list.size(); ++j) {
  122.             if(list.get(j) < pivot) {
  123.                 m1++;
  124.             }
  125.         }
  126.        
  127.         m2 = m1;
  128.         for(int j=0; j < list.size(); ++j) {
  129.             if(list.get(j) == pivot) {
  130.                 m2++;
  131.             }
  132.         }
  133.        
  134.         i1 = 0;
  135.         i2 = m1;
  136.         i3 = m2;
  137.        
  138.         while(i1 < m1 && list.get(i1) < pivot) {
  139.             i1++;
  140.         }
  141.        
  142.         while(i2 < m2 && list.get(i2) == pivot) {
  143.             i2++;
  144.         }
  145.        
  146.         while(i3 < list.size() && list.get(i3) > pivot) {
  147.             i3++;
  148.         }
  149.     } // init()
  150.    
  151.    
  152.     private void swap(List<Integer> list, int idx1, int idx2) {
  153.         Integer temp = list.get(idx1);
  154.         list.set(idx1, list.get(idx2));
  155.         list.set(idx2, temp);
  156.     }
  157. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement