1.基本思想
快速排序的基本思想就是把数组中每个数放到排序后数组中恰当的位置。
找到一个数,把大于该数的元素全部放到这个元素的后面,把小于该数的元素全部放到它前面,以此方法遍历数组所有元素直到所有元素都放在合适的位置上。
2.算法实现
排序具体算法,假设要排序的数组是,array[10] = {4,5,7,3,9,1,2,4,0,6}
(1)先找到tmp=array[start]作为基准;
(2)再运用双指针left,right分别从前向后遍历,和从后面向前遍历,当left=right或者遇到大于tmp的元素时暂停移动,当right=left或者遇到小于tmp的元素时暂停移动。如果left<right,交换left和right所指的元素,继续遍历;
(3)否则停止遍历,此时left=right,是tmp在该排序数组中合适的位置,交换array[left]和array[start],开始下一轮遍历,递归遍历剩下的左右两部分,直到所有元素都遍历完。
完整代码:
点击查看代码
void quick_sort(vector <int>& arr,int start,int end)
{
if(start>end)return ; //终止条件
int left=start;
int right=end;
int tmp=arr[start];
while(left<right)
{
while(left<right&&arr[right]>=tmp)
{
right--; //右指针往前移动,当i=j或者遇到arr[]<tmp暂停
}
while(left<right&&arr[left]<=tmp)
{
left++; //左指针往后移动,当i=j或者遇到arr[]>tmp暂停
}
if(left<right)
{
swap(arr[left],arr[right]);//交换两个元素,让大于tmp的数放后面,小于tmp的数放前面
}
}
swap(arr[left],arr[start]); // 此时left=right 是tmp在该数组中合适的位置
quick_sort(arr,start,left-1);
quick_sort(arr,left+1,end);
}
3.复杂度
速排序最坏时间复杂度是O(n^2),最好的时间复杂度为O(nlogn),平均时间复杂度是O(nlogn)。
空间复杂度是O(1),因为没有用到额外空间。
4.稳定性
排序交换过程中不能保证相等的元素排序后的顺序不变,故是不稳定的。