Algs4-2.3.5只有两种主键值的数组排序
1)从数组两端向中间找到第一对不同的值,然后将大值作为分界值。
2)从数组两端向中间找,左端找到等于大值时停止找,右端找到小于大值时停止找。
3)交换上面找到的两个值。
4)如此反复第2、第3步,直到中间相遇时结束。
注意:如果数据只有一种值时,代码不能正确运行。
public class E2d3d5
{
public static void sort(Comparable[] a)
{
if (a.length<2) return;
Comparable max=findMax(a);
int lo=0;
int hi=a.length-1;
while(true)
{
while(less(a[lo],max)) lo++;
while(!less(a[hi],max))hi--;
if(lo>=hi) break;
exch(a,lo,hi);
}
}
private static Comparable findMax(Comparable[] a)
{
Comparable max=a[0];
int lo=1;
int hi=a.length-1;
while(lo<=hi)
{
if (less(max,a[lo]) || less(a[lo],max))
{
if(less(max,a[lo])) max=a[lo];
break;
}
if (less(max,a[hi]) || less(a[hi],max))
{
if(less(max,a[hi])) max=a[hi];
break;
}
lo++;
hi--;
}//end while
return max;
}//end findMax
private static boolean less(Comparable v,Comparable w)
{ return v.compareTo(w)<0;}
private static void exch(Comparable[] a,int i,int j)
{
Comparable t=a[i];
a[i]=a[j];
a[j]=t;
}
private static void show(Comparable[] a)
{
for (int i=0;i<a.length;i++)
StdOut.print(a[i]+" ");
StdOut.println();
}
public static boolean isSorted(Comparable[] a)
{
for (int i=1;i<a.length;i++)
if(less(a[i],a[i-1])) return false;
return true;
}
public static void main(String[] args)
{
String[] a=In.readStrings();
sort(a);
assert isSorted(a);
show(a);
}
}