快速排序
思想:定义数组中的第一个数为标志量,再定义两个指针,一个指针从右向左开始遍历数组,直到找到一个数比标志量小;另一个指针再从左向右遍历数组,直到找到一个数比标志量大。若找到,则交换这两个数的位置,然后重复上述过程。直到两个指针相遇时,交换此时指针指向的数的位置与标志量的位置。此时,标志量左边的数均小于等于标志量,标志量右边的数均大于等于标志量。
上代码
public static void quickSort(int[] arr,int low, int high){
if(low >= high){
return;
}
int i = low;
int j = high;
int temp = arr[low];
int t;
while(i<j){
while(temp <= arr[j] && i<j){
j--;
}
while(temp >= arr[i] && i<j){
i++;
}
if(i<j){
t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
arr[low] = arr[i];
arr[i] = temp;
quickSort(arr,low,j-1);
quickSort(arr,j+1,high);
}
注:为什么要先让指针j移动?
因为当快排时只取到两个数时,如果这两个数是有序的,且让i指针先移动,就会使得i指针指向第二个数,然后结束while循环,并交换第一个数和第二个数的位置。这样就使得数组反而是未排好序的状态了。所以要让j指针先移动。