快速排序
快速排序是不稳定的排序算法,本文利用两种方法实现快速排序。
方法一
方法的主要思想是选取数组右端作为比较位置,先从左边比较,当找到大于比较值的元素,将该位置的值赋给right位置,right–;然后从右边开始比较,当找到小于等于比较值的元素,将该位置的值赋给left位置,left++;循环往复,直到不满足left<right,将比较值赋值给right。再结合递归思想,完成左右两边的比较,最终使数组有序。
public static void quickSort(int[] arr,int low,int high) {
if(low < high){
//分成两部分
int index = partition(arr,low,high);
//对左边进行快排
quickSort(arr,low,index-1);
//对右边进行快排
quickSort(arr,index+1,high);
}
}
public static int partition(int[] arr, int low, int high) {
int left = low;
int right = high;
int compare = arr[high];
//使用循环实现左边小于等于比较值,右边大于比较值
while(left<right){
while(arr[left]<=compare && left<right){
left++;
}
if(left<right){
arr[right--] = arr[left];
}
while(arr[right]>compare && left<right){
right--;
}
if(left<right) {
arr[left++] = arr[right];
}
}
// 将比较值赋值给中间
arr[right] = compare;
// 返回位置索引
return right;
}
方法二
方法的主要思想是将数组中小于比较位置值的放左边,等于的放中间,大于的放右边;再结合递归思想,完成左右两边的比较,最终使数组有序。该方法的最大优点是中间部分不用参与下次递归。
public static void sort(int[] nums){
if(nums==null){
return;
}
quickSort(nums,0,nums.length-1);
}
public static void quickSort(int[] nums,int i,int j){
if(i<j){
int[] p = partation(nums,i,j);
quickSort(nums,i,p[0]-1);
quickSort(nums,p[1]+1,j);
}
}
public static int[] partation(int[] nums,int i,int j){
// 利用随机数作为比较位置
// int k = (int) (Math.random()*(j-i)+i);
// swap(nums,k,j);
int less = i-1;
int more = j;
// 取最后一个作为比较位置,小于的放左边,等于的放中间,大于的放右边
// 假如数组为2,3,1,5,4,1,3,调用一次变成2,1,1,3,3,5,4,数组的less为2,more为4
while(i<more){
if(nums[i]<nums[j]){
swap(nums,++less,i++);
}else if(nums[i]==nums[j]){
i++;
}else{
swap(nums,--more,i);
}
}
swap(nums, more, j);
int[] p = new int[2];
p[0] = less+1;
p[1] = more;
return p;
}
public static void swap(int[] nums,int i,int j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}