import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

import java.util.*;

public class TableSort extends JApplet {
int t[];//permutation array
JButton sort;
int list[];//data records
JTextArea ta;
final int size=20;
 

public String getContents(int heap[]){
String tmp="";
for(int k=0;k<size;k++){
 tmp=tmp+"  "+heap[k];
 if(k%10==0)
    tmp=tmp+'\n';}
return tmp;
}
public void swap(int x[],int a,int b){
 int tmp=x[a];
 x[a]=x[b];
 x[b]=tmp;
}//swap

public void init(){
Random thing=new Random();
sort =new JButton("sort");
ta=new JTextArea(20,50);
list=new int[size];
for(int j=0;j<size;j++)
  list[j]=thing.nextInt(1000);

t=new int[list.length];
 for(int i=0;i<size;i++)
   t[i]=i;
 Container c=getContentPane();
 c.setLayout(new BorderLayout());
 c.add(ta,BorderLayout.CENTER);
 c.add(sort,BorderLayout.SOUTH);
 ta.setText("Array is"+getContents(list));
 ta.append("\noriginal"+getContents(t));//original order
 sort.addActionListener(new ActionListener(){
  public void actionPerformed(ActionEvent e){
someIndexSort(list,t);
ta.append("\nsort ");
ta.append("Array is"+getContents(list));
ta.append("\npermutation is"+getContents(t));//sorted order
ta.append("\ntable sort ");

table(list,t);
ta.append("Array is"+getContents(list));
  }
 }
 );
 

}//init
public void someIndexSort(int x[],int index[]){

  for(int i=1;i<x.length;i++)
    for(int j=i;j>0&&x[index[j-1]]>x[index[j]];j--)
       swap(index,j,j-1);
   }//insertion sort on indices
 

public void table(int list[],int t[]){
int n=list.length;
for(int i=0;i<n;i++)
   if(t[i]!=i){//non trivial cycle
      int p=list[i];
      int j=i;
      do{
   int k= t[j];
   list[j]=list[k];
   t[j]=j;
   j=k;
  }while(t[j]!=i);//haven't got around cycle yet
  list[j]=p;
  t[j]=j;
 }//if
}//table
 

}//applet