快速排序:
1)在待排序表L[1…n]中任取一个元素pivot作为枢轴(通常取首元素)
2)通过一趟排序将待排序表划分为独立的两部分 L[1…k-1] 和 L[k+1…n] ,
使得 L[1…K-1] 中的所有元素小于pivot,L[k+1…n] 中的所有元素大于等于pivot,
则pivot放在了其最终位置L(k)上,这个过程称为一趟快速排序(或一次划分)
3)分别递归的对两个子表重复上述过程
public class 快速排序 {
public static void main(String[] args) {
// int nums[]={3,4,5,2,1};
int nums[]={49,38,65,97,76,13,27,49,55,04};
sort(nums,0,nums.length-1);
System.out.println(Arrays.toString(nums));
}
static void sort(int []nums ,int low,int high){
//递归跳出的条件
if (low<high){
int pivotpos = Partition(nums,low,high); //划分
//对左子表进行递归排序
sort(nums,low,pivotpos-1);
//对右子表进行递归排序
sort(nums,pivotpos+1,high);
}
}
//一趟划分,使得枢轴元素找到最终位置
static int Partition(int nums[],int low,int high){
//将首元素作为枢轴,对表进行划分
int pivot = nums[low];
while(low<high){
//从后向前判断 当前元素是否都>或=枢轴元素
while(low<high && nums[high]>=pivot) high--;
//将比枢轴小的元素移动到左端
nums[low] = nums[high];
//从前向后判断 当前元素是否都<或=枢轴元素
while(low<high && nums[low]<=pivot) low++;
//将比枢轴大的元素移动到右端
nums[high] = nums[low];
}
//枢轴元素存放到最终位置
nums[low]=pivot;
//返回存放枢轴的最终位置
return low;
}
}