快速排序

我们从数组中选择一个元素,我们把这个元素称之为中轴元素吧,然后把数组中所有小于中轴元素的元素放在其左边,所有大于或等于中轴元素的元素放在其右边,显然,此时中轴元素所处的位置的是有序的。也就是说,我们无需再移动中轴元素的位置。

从中轴元素那里开始把大的数组切割成两个小的数组(两个数组都不包含中轴元素),接着我们通过递归的方式,让中轴元素左边的数组和右边的数组也重复同样的操作,直到数组的大小为1,此时每个元素都处于有序的位置。
public class QuickSort {
public static int[] quickSort(int[] arr, int left, int right) {
if (left < right) {
//获取中轴元素所处的位置
int mid = partition(arr, left, right);
//进行分割
arr = quickSort(arr, left, mid - 1);
arr = quickSort(arr, mid + 1, right);
}
return arr;
}

 private static int partition(int[] arr, int left, int right) {
     //选取中轴元素
    int pivot = arr[left];
     int i = left + 1;
     int j = right;
     while (true) {
         // 向右找到第一个小于等于 pivot 的元素位置
         while (i <= j && arr[i] <= pivot) i++;
         // 向左找到第一个大于等于 pivot 的元素位置
         while(i <= j && arr[j] >= pivot ) j--;
         if(i >= j)
             break;
         //交换两个元素的位置,使得左边的元素不大于pivot,右边的不小于pivot
         int temp = arr[i];
         arr[i] = arr[j];
         arr[j] = temp;
     }
     arr[left] = arr[j];
     // 使中轴元素处于有序的位置
     arr[j] = pivot;
     return j;
 }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值