快速排序
1 算法介绍:
快速排序属于“交换类排序”,通过多次划分操作实现排序。接下来以升序为例介绍算法步骤。在一趟选择当前序列中的一个关键字(通常是第一个)作为中间轴,将当前序列中比中间轴小的元素移到中间抽左边,比中间轴大的元素移动到中间轴右边;当本趟结束后,当前序列中以中间轴为基准,被划分为两个子序列,左边子序列的元素都不大于中间轴,二右边的子序列的元素则都不小于中间轴。接下来再将这两个子序列分别重复以上步骤。
2算法执行流程
首先进行第一趟排序;
1.在开始是first,last分别指向序列的头元素和尾元素,以头元素为中间轴,用last开始从右往左开始扫描,直到遇到比中间轴小的元素,此时last指向该元素的下标;然后把该元素挪到first所指的位置上。
2.然后用first开始从左往右扫描,直到遇到比中间轴大的元素,此时first指向该元素的位置,然后将该元素挪到last所值的位置上去。
3.然后继续挪动last指针(即重复1步骤,然后重复2步骤,知道first指针和last指针相遇),这时将中间轴的元素放到该位置上;这样就完成了一趟划分。接下来分别对中间轴两边的两个子序列做同样的划分操作。
3代码实现
void quick_sort(vector<int>&v,int low,int hight)
{
if(low>hight)
{
return;
}
int first=low,last=hight,key=v[first];
while(first<last)
{
while(first<last&&v[last]>=key)
{
--last;
}
v[first]=v[last];
while(first<last&&v[first]<=key)
{
++first;
}
v[last]=v[first];
}
v[first]=key;
quick_sort(v,low,first-1);
quick_sort(v,first+1,hight);
}
void printVector(vector<int>&v)
{
for(auto it=v.begin();it!=v.end();it++)
cout<<*it<<" ";
}
int main()
{
vector<int>v={49,38,65,97,76,13,27,49};
quick_sort(v,0,v.size()-1);
printVector(v);
return 0;
}
4算法性能分析
4.1时间复杂度分析
快速排序最好的情况下的时间复杂度为O(nlog2(n)),待排序的序列越接近无序,本算法的效率越高。最坏的情况下的时间复杂度为O(n^2) ,待排序序列越接近有序本算法效率越低。平均情况下时间复杂度为O(nlog2(n)),快速排序的排序趟数和初始序列有关。
4.2空间复杂度
空间复杂度为O(log2(n)).快速排序是递归进行的,递归需要借助栈的辅助,因此它需要的辅助空间比前面几类排序算法大。