文章目录
快速排序
把起始位置的元素做为pivot 从前往后找比pivot大的数 从后往前找piovt值小的数 然后交叉交换 直到low和high重合 这时数组被分成两部分 然后递归的对其他部分排序 快速排序的主要思想是通过划分将待排序的序列分成前后两部分,其中前一部分的数据都比后一部分的数据要小,然后再递归调用函数对两部分的序列分别进行快速排序,以此使整个序列达到有序
代码框架:
void sort(int nums[],int low,int high){
//前序遍历起点
int p =paritition(nums,low,high);
sort(nums,low,p-1);
sort(nums,p+1,low);
}
class solution{
public:
vector<int>sortArry(vector<int>&nums){
int n=nums.size();
Quicksort(nums,0,n-1,n);
return nums;
}
void QuickSort(vector<int>&nums,int low, int high,int n){
if(low<high){
int pivotpos = partition(nums,low,high);
QuickSort(nums,low,pivotpos-1,n);
Quicksort(nums,pivotpos+1,high,n);}
}
int partition(vector<int>&nums,int low,int high){
int pivot = nums[low];
while(low<high){
while(low<high&&nums[high]>=pivot)--high;
nums[low]=nums[high];
while(low<high&&nums[low]<=pivot)++low;
nums[high]=nums[low];
}
nums[low]=pivot;
return low;
}
};
数据
注意:low和high仅仅是数字,且每次是两个while语句交替进行;
时间复杂度分析:
最坏情况,栈长为O(n),栈的高度为O(n),每层需要遍历为O(n)
则此情况时间复杂度为O(n^2)
最佳情况也是一般情况,栈的深度为O(logn)*{二分搜素为N/(2^f(n))=1,其中f(n)=log2N,即O(n)=O(logn)}*每层需要遍历O(n)则时间复杂度为O(nlogn)