快排
快速排序
介绍 时间复杂度O(nlogn) 不稳定 基于比较
代码实现
递归版
一个分治的递归主函数,一个实现partition的函数,这里给出patition函数实现的三种方式。
// 主函数
public void quickSort(int[] nums, int left, int right) {
if (left >= right) {
return;
}
// p的索引为nums[0]排好序的位置,以此为分界点将问题分解为求左右两个子数组的排序
int p = partition1(nums,left,right);
// int p = partition2(nums,left,right);
// int p = partition3(nums,left,right);
quickSort(nums, left,p-1);
quickSort(nums, p+1, right);
}
// 实现patition
// 3种方式
// 双指针 交换
public int partition1(int[] nums, int left, int right) {
int p = nums[left];
int l = left;
int r = right;
while (l < r) {
while (l < r && nums[r] > p) {
r--;
}
while (l < r && nums[l] <= p) {
l++;
}
if (l < r) {
int t = nums[r];
nums[r] = nums[l];
nums[l] = t;
}
}
nums[left] = nums[r];
nums[r] = p;
return r;
}
// 双指针 填坑
private int partition2(int[] nums, int left, int right) {
int p = nums[left];
int l = left;
int r = right;
while(l < r) {
while(l < r && nums[r] > p) {
r--;
}
if (l < r) {
nums[l] = nums[r];
l++;
}
while(l < r && nums[l] <= p) {
l++;
}
if (l < r) {
nums[r] = nums[l];
r--;
}
}
nums[r] = p;
return r;
}
// 单指针 整理
private int partition3(int[] nums, int left, int right) {
int p = nums[left];
int mark = left;
for(int i=left+1;i<=right;i++) {
if (nums[i] < p) {
mark++;
int t = nums[mark];
nums[mark] = nums[i];
nums[i] = t;
}
}
nums[left] = nums[mark];
nums[mark] = p;
return mark;
}