个人拙见理解使用Java进行快速排序
看其他人写博客的快速排序,总是交换来交换去的,不能很容易理解,个人从另一个角度理解快速排序。
快速排序事实上就选一数为中间轴,比它小的在前面,大的在后面,比如一组数据48、37、64、96、75、12、26
就是将37,12,26放在48前面,64,96,75放在后面,即第一个交换结果为37、12、26、48、64、96、75
当然数据序列可能有些偏差,下面说一下思路
public static int partition(int array[], int low, int high) { //当前位置为第一个元素所在位置 int p_pos = low; //采用第一个元素为轴 int pivot = array[p_pos]; for (int i = low + 1; i <= high; i++) { if (array[i] < pivot) { p_pos++; swap(array, p_pos, i); System.out.println(Arrays.toString(array)); } } swap(array, low, p_pos); System.out.println(Arrays.toString(array)); return p_pos; }
相当于{48,37,64,96,75,12,26}为当前数组,重新创建一个新数组{48,空,空……},中间轴数pos就是固定的48
先拿37和48进行比较,小于且等于(<=),37放在第二个空即为{48,37,空……},事实上代码是将37和第二个位置数进行交换,也就是37和37交换
遍历之后12小于且等于(<=)48,置换第三个空,也就是12和46交换
同理26和96交换,最后变为48, 37, 12, 26, 75, 64, 96,
遍历完后,再将第一个数和中间轴数pos交换,变为26, 37, 12, 48, 75, 64, 96
为什么不先把48和pos=48比较,因为比较后48会一直改变
只要将后面6个数划分两个块,48和较小的块最后一个数交换即可
当然只用到了一个判定只是为了方便理解,在算法设计上并不是从前往后遍历的,
public static int partition(int array[], int low, int high) { //当前位置为第一个元素所在位置 int p_pos = low; //采用第一个元素为轴 int pivot = array[p_pos]; int i=low,j=high; while(i < j){ while(array[j] > pivot) j--; swap(array, i, j); while(array[i] < pivot) i++; swap(array, i, j); } System.out.println(Arrays.toString(array)); return i; }
而是先左边再右边,右边再左边