快速排序思路:
通过将数组层层分组,当每组数据都有序后,整体数据也实现了有序。
首先选择一个基准数base,其次生成左右两个指针i,j,然后左右指针开始向对方移动,左指针在移动过程中寻找大于基准数的数据,而右指针寻找小于基准数的数据,当左右指针指向的数据符合要求时指针停止。当两个指针尚未相遇,并都停止后交换指针指向的数据。然后指针继续移动直至左右指针相遇,接着指针共同指向的数据和基准数数据交换位置。这样,在当前基准数左右两侧分为了两组,左侧数据都小于基准数,而右侧数据都大于基准数。最后对左右两侧数据继续进行排序,直到实现整体有序。
public class test_快速排序 {
public static void main(String[] args) {
}
public static void quickSort(int[] arr,int left,int right){
//选择最左边的作为基准数
int base = arr[left];
int i = left; //i为左指针 为数组最左端
int j = right;//j为右指针 为数组最右端
//如果左指针i和右指针j还未相遇
while(i!=j){
//右指针开始从数组最右端开始寻找比基准数小的数字。如果不比基准数小,则指针向左移动一位
while(arr[j]>= base&&i<j){
j--;
}
//左指针开始从数组最左端开始寻找比基准数大的数字。如果不比基准数大,则指针向右移动一位
while(arr[i]<=base&&i<j){
i++;
}
//当代码运行到这里,右指针指向一个比基准数小的数组,左指针也指向了一个比基准数大的数字。则两个指针指向的数字
//交换位置
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//执行到这里,则左指针和右指针相遇。另基准数和左指针与右指针共同指向的数字交换位置
arr[left] = arr[i];
arr[i] = base;
//第一遍循环完成,则原数组分为了数组起始位置到左右指针共同指向的数字 和 数组末尾位置到左右指针共同指向的数字两部分
//此时基准数在这里 左边的数字都比他小,而右边的数字都比他大
//然后数组起始 到 左右指针共同指向的前一位 继续开始排序
quickSort(arr,left,i-1);
//左右指针共同指向的后一位到数组末尾位置 也继续开始排序
quickSort(arr,j+1,right);
}
}