class QuickSort {
public static void main(String[] args) {
int[] nums={11,24,5,32,50,34,54,76};
System.out.println("快速排序前:"+ Arrays.toString(nums));
quickSort(nums,0,nums.length-1);
System.out.println("快速排序后:"+ Arrays.toString(nums));
}
public static void quickSort(int[] nums, int start, int end){
if(start>end) return;
int i,j,base;
i=start;
j=end;
base=nums[start];
while (i<j){
while (i<j && nums[j]>=base) j--; //从右边开始找,找比base小的
while (i<j && nums[i]<=base) i++; //从左边开始找,找比base大的
if(i<j){
swap(nums,i,j);
}
}
//循环结束找到第一个i值,也就是当前base最终的位置
swap(nums,start,i); //交换base值与当前位置的值
quickSort(nums,start,j-1);
quickSort(nums,j+1,end);
}
public static void swap(int[] nums,int left,int right){
int temp=nums[left];
nums[left]=nums[right];
nums[right]=temp;
}
}
快速排序:
记忆秘诀:
快速排序有两个函数,一个比较找i位置的函数,一个交换函数
比较找i位置函数:base值=num[start],然后从两边开始对比,右边找小的,左边找大的,找到就交换,知道i相遇j,这就是base最终的位置,然后交换num[start]和num[i]也就是num[j],此时的i=j,然后接着快排num[start]---num[i-1]和num[i+1]---num[end]的。
交换函数:就是简单的交换两个数的位置
1、首先快速排序需要三个参数:排序的数组num[]、左边界i,右边界j
2、以第一个num[i]为base值,然后从两边开始比较
3、先从右边num[j]开始找比base小的值,找到后停下来,左边开始从i开始找比base大的值,找到后停下来,判断当前i是否小于j,如果小于,那交换num[i]、num[j]。
4、交换完之后接着进行重复的工作,知道i=j了,也就是第一次遍历相遇了,第一次遍历结束,找到了base最终的位置,也就是此时i的值,同时也是j的值,将base值与i值交换
5、接着快拍start----i-1和i+1-----end两段