copy1 and copy2 are deep (element by element) copies of Orig.
copy3 is a shallow copy of Orig - actually just a pen name for Orig; that is copy3 and Orig reference the address at which that array is stored.
To see this look at what happens when you change Orig.

Of course, before we start sorting, Orig, copy1 and copy2 are all identical. LexSort is defined as copy1.sort() Notice that copy1 has changed --- that is the sort changes the array on which it is called. The same thing is true when we execute realSort=copy2.sort(compareSort); Again, copy2 is changed. Actually, LexSort is just another name for copy1 and realSort is just another name for copy2 - not surpising considering what happened with copy3

Orig is:
7
5
130
-12
-6

Now change Orig[0] to 99
Orig is:
99
5
130
-12
-6

copy3 is:
99
5
130
-12
-6

copy1 is:
-12
-6
130
5
7

LexSort is:
-12
-6
130
5
7

realSort is:
-12
-6
5
7
130

copy2 is:
-12
-6
5
7
130

Now change the 0 entry of copy1 and copy 2 and see if LexSort and realSort change
copy1[0] and LexSort[0] are -100 and -100
copy2[0] and realSort[0] are -10000 and -10000