1.快速排序算法通过多次比较和交换来实现排序,其排序流程如下:
1、首先设定一个分界值,通过该分界值将数组分成左右两部分。
2、将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于分界值,而右边部分中各元素都大于或等于分界值。
3、然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
4、重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。
2. java实现
public void quickSort(int[] nums){
// 判断是否为正经数组
if(nums == null || nums.length == 0);
// 快速排序
quickSort(nums, 0, nums.length - 1);
}
public void quickSort(int[] nums, int lo, int hi){
if(lo >= hi) return; // 如果地位 >= 高位,直接结束
int temp = nums[lo]; // 选取低位所对应的值作为本轮需要确定位置的数
int mid = lo; // mid 用于记录最终选举数的位置
int l = lo, h = hi; // 记录低位和高位
while (lo < hi){ // 开始变换位置
while (lo < hi && nums[hi] > temp){ // 高位大于选举的数值,不需要换位置, 寻找高位小于选举数的位置
hi--;
}
nums[lo++] = nums[hi]; // 更换高位小于选举的数字到低位位置
mid = hi; // 记录中间位置
if(lo >= hi) break; // 如果地位 >= 高位,直接结束
while (lo < hi && nums[lo] < temp){ // 刚才已经变换了高位位置 现在从低位开始寻找大于选举数的位置
lo++;
}
nums[hi--] = nums[lo]; // 更换低位大于选举数到高位位置
mid = lo; // 记录中间位置
}
nums[mid] = temp; // 将选举数放入对应位置
quickSort(nums, l, mid - 1); // 选举数左边递归
quickSort(nums, mid + 1, h); // 选举数右边递归
}
3.时间复杂度与空间复杂度及测试结果
时间复杂度:平均为O(nlogn), 对于乱序的数组友好
空间复杂度:O(1)
力扣912题测试结果:测试用例全部通过,但时间较长,大概是因为测试用例中有已经排序好的用例。