public class Solution {
/**
* @param A: an integer array
* @return: nothing
*/
int partition(int[] A,int low,int high){
int tmp = A[low];//这里容易出错,我写的是A[0]
while(low < high){
while(low < high && A[high] >= tmp)
high--;
A[low] = A[high];
while(low < high && A[low] <= tmp)
low++;
A[high] = A[low];
}
A[low] = tmp;//注意:最后要把这个赋值
return low;
}
void quicksort(int[] A,int low,int high){
if(low < high){//这里是if
int pivot = partition(A,low,high);
//注意:这里pivot的位置已经排好了,所以下面不在包含它
quicksort(A,low,pivot-1);
quicksort(A,pivot+1,high);
}
}
public void sortIntegers2(int[] A) {
// write your code here
quicksort(A,0,A.length-1);
}
}
我依旧是只是会写,能看懂,会背代码!离大乘还远的很啊!
补充:
(1)注意,这里quicksort()内的参数是数组的长度减1 …….A.length - 1。
(2)划分中的第一行代码int tmp = A[low];
,这个tmp是指low位置的值,第一次是0,但是后面的就不一定了。
(3)如果实在随机快速排序中,差异就是我选定的那个值pivot不再是数组的第一个了,而是随机产生的一个,但是在快速排序中,只要把这个选定的随机值放在第一个位置去即可。不过随机函数的产生到有点不同,如下:int index = r.nextInt(high - low) + low;
。这个很重要。
int pivot = nums[index];
(4)while中的条件:low < high。前后两个条件是可以交换的,安全!
(5)先从后向前移动,即第一个动的是high指针。然后将符合条件的那个值放入A[low]。
(6) 注意:最后要把这个赋值A[low] = tmp;
这时候low和high指向了同一个位置。