1.快速排序的思想
分治递归的思想;
1.实现快速排序需要知道快速排序的流程
1.选取数组中第一个位置的元素(a[low])作为 基准元素(piovt),最后一个位置的元素作为(a[high]);
2.基准元素(piovt):用来作为数组排序的基准所需要的元素,将来递归的时候,大于基准元素的放基准元素右边,小于基准元素的放基准元素的左边
3.第一次递归结束后,low和high重合的位置就是当前递归基准元素(piovt)的正确位置,将基准元素(piovt)放回正确位置
4.然后将数组递归的分为两部分,第一部分为基准元素(piovt)左侧的全部数=(0,piovt),第二部分为基准元素(piovt)的右侧全部数=(piovt+1,high).
5.将数组递归完之后,所得到的数组就是排序好的数组
2.快速排序的代码实现
1.需要用两个函数分别实现1.基准元素的查找,2.数组的递归快速排序
1.基准元素 索引 的查找
1.定义两个变量i,j分别指向数组的第一个元素和最后一个元素
定义 基准元素(piovt)等于数组的第一个元素
2.在传进来的数组有效的前提下
while (i < j)
(1)将小于基准元素的 值 放基准元素左边,如果j当前指向的元素小于piovt,则向左走一步,遍历下一个元素
while (i < j && nums[j] >= piovt) {
//如果遇到的元素>=piovt则j--向左移动 找下一个值
j--;
}
nums[i] = nums[j];
(2) 如果j当前所指向的元素小于当前基准元素(piovt),则将当前元素nums[j]与变量i所指向的位置nums[i]交换
nums[i] = nums[j];
(3)将大于基准元素的 值 放基准元素右边 (上述同理)
//基准元素左侧值大于基准元素 将其放到基准元素的左边
while (i<j && nums[i]<piovt) {
i++;
}
nums[j] = nums[i];
}
(4)最后,将基准元素放到正确位置
// 将基准元素放到最终位置
nums[i] = piovt;
//返回最终基准元素所在的位置
return i;
最终寻找基准元素索引的函数如下:
//寻找基准元素的索引
int part(vector<int>& nums, int low, int high) {
int i = low, j = high;
//基准元素
int piovt = nums[low];
while (i < j) {
//基准元素右侧值小于等于基准元素 将其放到基准元素的左边
while (i < j && nums[j] >= piovt) {
//如果遇到的元素>=piovt则j--向左移动 找下一个值
j--;
}
nums[i] = nums[j];
//基准元素左侧值大于基准元素 将其放到基准元素的左边
while (i<j && nums[i]<piovt) {
i++;
}
nums[j] = nums[i];
}
// 将基准元素放到最终位置
nums[i] = piovt;
//返回最终基准元素所在的位置
return i;
}
2.数组的递归快速排序
1.mid为索引函数求的每次递归的 基准元素的索引
//快速排序
void Quickly(vector<int>& nums, int low, int high) {
if (low < high) {
int mid = part(nums, low, high);
Quickly(nums, low, mid - 1);
Quickly(nums, mid + 1, high);
}
}
3.最终实现的快速排序代码
#include<iostream>
#include<stdexcept>
#include<vector>
using namespace std;
//快速排序
//
//分治递归思想
//寻找基准元素
int part(vector<int>& nums, int low, int high) {
int i = low, j = high;
//基准元素
int piovt = nums[low];
while (i < j) {
//基准元素右侧值小于等于基准元素 将其放到基准元素的左边
while (i < j && nums[j] >= piovt) {
//如果遇到的元素>=piovt则j--向左移动 找下一个值
j--;
}
nums[i] = nums[j];
//基准元素左侧值大于基准元素 将其放到基准元素的左边
while (i<j && nums[i]<piovt) {
i++;
}
nums[j] = nums[i];
}
// 将基准元素放到最终位置
nums[i] = piovt;
//返回最终基准元素所在的位置
return i;
}
//快速排序
void Quickly(vector<int>& nums, int low, int high) {
if (low < high) {
int mid = part(nums, low, high);
Quickly(nums, low, mid - 1);
Quickly(nums, mid + 1, high);
}
}
int main() {
vector<int>nums = { 9, 7, 5, 11, 12, 2, 14, 3, 10, 6 };
Quickly(nums, 0, nums.size() - 1);
for (int i : nums) {
cout << i << " ";
}
}
时间复杂度上述快速排序代码的
平均时间复杂度为O(n log n),
最坏情况下的时间复杂度为O(n^2),
最佳情况下的时间复杂度为O(n log n)。