思想: 快速排序采用分而治之的思想。
任取待排序序列的第一个元素作为中心元素,习惯将其称为pivot,枢轴元素;
- 将所有比枢轴元素小的放在其左边;
- 将所有比它大的放在其右边;
- 形成左右两个子表;
- 然后对左右两个子表再按照前面的算法进行排序,直到每个子表的元素只剩下一个。
将一个数组分成两个数组的方法为:
- 先从数组右边找到一个比枢轴元素小的元素,将数组的第一个位置赋值为该元素;
- 再从数组的左边找到一个比枢轴元素大的元素,将从上面取元素的位置赋值为该值;
- 依次进行,直到左右相遇,把枢轴元素赋值到相遇位置。这个位置的左右两侧分别划分为两个数组,递归执行。
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
int[] arr = {39,28,55,87,66,3,17,39};
sort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
public static void sort(int[] arr,int left,int right){
int mid;
if (left < right){
mid = partition(arr,0,arr.length-1);
partition(arr,left,mid-1);
partition(arr,mid+1,right);
}
}
public static int partition(int[] arr, int left, int right){
int pivot = arr[left];
while (left < right){
while (left < right && arr[right] >= pivot){
right--;
}
arr[left] = arr[right];
while (left < right && arr[left] <= pivot){
left++;
}
arr[right] = arr[left];
}
arr[left] = pivot;
System.out.println(Arrays.toString(arr));
return left;
}
}