快速排序
快速排序是一种著名的排序算法,1960年前后由英国科学家C. A. R. Hoare提出。其排序思想为:
- 从数列中挑出一个元素,称为基准(pivot)。
- 重新排序数列,所有比基准值小的元素放在基准前面,所有比基准值大的元素放在基准的后面。在分区结束后,该基准值就处于数列的中间位置,称为分区操作。
- 递归(Recursive)把小于基准值元素的子数列 和 大于基准值的子数列排序。
程序实现
- Python
def quick_sort(ls):
def q_sort(ls,left,right):
if left >= right:
return
i,j = left,right
pivot = ls[left]
while i<j:
while ls[j] > pivot and i<j:
j -= 1
ls[i] = ls[j]
while ls[i] <= pivot and i<j:
i += 1
ls[j] = ls[i]
ls[i] = pivot
q_sort(ls,left,i-1)
q_sort(ls,i+1,right)
return ls
return q_sort(ls,0,len(ls)-1)
- C++
int partition(int nums[], int left, int right) //找基准数 划分
{
int i = left;
int j = right;
int temp = nums[left];
while(i < j){
while (i<j && nums[j] > temp){
j--;
}
nums[i] = nums[j];
while (i<j && nums[i] <= temp ){
i++;
}
nums[j] = nums[i];
}
nums[i] = temp;
return i;
}
void quick_sort(int nums[], int left, int right) {
if (left >= right)
return;
int i = partition(nums, left, right);
quick_sort(nums, left, i - 1);
quick_sort(nums, i + 1, right);
}
复杂度和稳定性
- 复杂度
抽象地看,快速排序产生的划分结构,可以看作以枢轴记录为根,以两个划分分段进一步划分的结果作为左右子树的二叉树。根据二叉树理论,所有n个结点的二叉树的平均高度为O(log n)。因此快速排序的平均时间为O(n log n)。
- 稳定性:不稳定。
当数列有两个或以上的元素时,快速排序会打破他们之间原有的顺序。