- 我们假设初始序列为 a[12,3,8,6,1,56,9,35,10],长度为9;
- 这里我用f指向第一个元素,l指向最后一个元素。f->a[0]=12、l->a[8]=10;
- 指向尾端的指针前移,首先判断l指向的值,即10小于第一个值12,l不移动;
- l停住之后,f开始向后移动寻找比12大的第一个遇到的值,即当f->a[5]=56时停住;
- 此时l和f都已停住,此时交换f和l指向的两个值,序列由原来的a[12,3,8,6,1,56,9,35,10]变为a[12,3,8,6,1,10,9,35,56],值变了但是f和l指向的位置不变;
- 第一次比较完仍然是l先移动,即回到第三步,当l->a[6]=9时,l遇到了第二个小于12的值,l停住;
- 回到第四步,f开始移动,当f->a[6]=9时f未找到比12大的值但是f和l碰面了,所以f也停住;
- 回到第五步,交换12和两个指针相遇的值,序列由a[12,3,8,6,1,10,9,35,56]变为a[9,3,8,6,1,10,12,35,36];
- 两个指针重合的地方是a[6]=12,现在以12为中点不动,前后分为两个数组继续排序即左边[9,3,8,6,1,10]右边[35,36];
- 继续第三到第九步分别排序左边和右边的序列;
左边序列[9,3,8,6,1,10]:
第一遍:[1,3,8,6,9,10]此时又以9为中点分为左边[1,3,8,6]右边[10]
第二遍:[1,3,8,6]f和l相遇在1,所以要以1为中点右边[3,8,6]
第三遍:[3,8,6]f和l相遇在3,所以要以3为中点右边[8,6]
第四遍:[8,6]排序后[6,8]至此左边已排好为[1,3,6,8,9,10]
第五遍:[35,36]已排好,所以最终排好序的结果为a[1,3,6,8,9,10,12,35,36]。
java实现:
public class Main {
public static void main(String[] args) {
int aa[] = new int[] { 12, 3, 8, 6, 1, 56, 9, 35, 10 };
sort(aa, 0, 8);
for (int a : aa) {
System.out.println(a + ",");
}
}
public static int getHigh(int[] list, int low, int high) {
int f, l, temp, t;
temp = list[low];
while (low != high) {
while (list[high] > temp && high > low) {//从最后向前移动对应第三到第六步
high--;
}
t = list[high];
while (list[low] < temp && high > low) {//从前向后移动对应第七步
low++;
}
list[high] = list[low];
list[low] = t;
}//一个循环结束排好第一次f和l相遇
return high;
}
public static void sort(int[] array, int low, int high) {
if (low >= high) {
return;
}
int iHigh = getHigh(array, low, high);
sort(array, low, iHigh- 1);//递归排一次结束之后中点左边的序列
sort(array, iHigh+ 1, high);//递归排一次结束之后中点右边的序列
}
}