"沉默加速度是我的脚步
奔跑在视线里的路
我不要祝福不理会孤独
奔向最远处…"
以这首歌献给快速排序,也献给自己以及奋斗在路上的伙伴们,在码路上能自由得加速度,一起奔向自己想要的更远处.
public class Quick{
//
public static void sort(Comparable[] a){
int left = 0;//左边下标从0开始
int right = a.length-1;//右边下标为长度-1开始
sort(a, left, right);//排序数组,传入数组及左边下标和最大下标
}
//
private static void sort(Comparable[] a, int left, int right){
if(right <= left){//右边下标数必须大于左边下标数,否则跳出程序
return;
}
int partition = partition(a, left, right);
sort(a, left, partition - 1);
sort(a, partition + 1, right);
}
//将数组分割成左右两边,并返回分割的分界值的下标
private static int partition(Comparable[] a, int left, int right){
Comparable key = a[left];//key为将数组分割左右的分界值
int startL = left;//从左边的下标开始
int startR = right + 1;//从右边的下标+1开始
while(true){
while(less(key, a[--startR])){//分界值与右边下标向左的数相比,找到比分界值小的数停止
if(startR == left){//当右边开始下标向左到达最左边时跳出循环
break;
}
}
while(less(a[++startL], key)){//分界值与左边下标向右的数相比
if(startL == right){//当左边开始下标向右到达最右边时跳出循环
break;
}
}
if(startL >= startR){//如果左边开始的下标大于等于右边开始的下标,停下
break;
}else{
exch(a, startL, startR);//否则左右开始下标索引对应的数值互换
}
}
exch(a, left, startR);//分界值下标 与 左右开始而重合的下标 索引对应的值互换
return startR;//将重合的下标作为新的分界值下标返回
}
//比较哪个元素更小
private static boolean less(Comparable v, Comparable w){
return v.compareTo(w) < 0;
}
private static void exch(Comparable[] a, int i, int j){
Comparable temp;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
数据结构之排序篇还有第二季喔,不过可能稍微要再等等,明天想把整理的一些Hadoop相关的知识也分享一点.