最近学到了数据结构的排序,对其算法进行总结。
快速排序
class Solution {
public int[] sortArray(int[] nums) {
if(nums==null||nums.length==0){
return null;
}
quickSort(nums,0,nums.length-1);
return nums;
}
public void quickSort(int[] nums,int left,int right){
if(left<right){
int mid=partition(nums,left,right);
quickSort(nums,left,mid-1);
quickSort(nums,mid+1,right);
}
}
public int partition(int[] nums,int left,int right){
int temp=left+(int)(Math.random()*(right-left+1));
//先随机选择一个基准,比这个基准小的放在左边,比这个基准大的放在右边
swap(nums,temp,left);
//将基准放在最左边,nums[left]和nums[temp]互换
int i=left;
//慢指针从left位置开始遍历,指向比基准小的数字
int j=left+1;
//快指针从left+1开始遍历,指向比基准大的数字
while(j<=right){
if(nums[j]<nums[left]){
//如果nums[j]比基准小,nums[i+1]和nums[j]交换位置,并且i+1
swap(nums,j,++i);
}
j++;
//每次循环,j的值都是要加1的
}
swap(nums,left,i);
//循环结束后,i指针所在位置为数组中比基准小的最后一个位置,将其和最左边的基准交换位置,交换完以后,i位置之前的都是比它小的,i位置之后都是比它大的
return i;
//返回i,该位置的元素已经排序完成,接下来排序i之前和i之后的元素
}
public void swap(int[] nums,int i,int j){
int tmp=nums[i];
nums[i]=nums[j];
nums[j]=tmp;
}
}