排序的本质就是消除逆序对。以升序为例,就是消除"左边大右边小"的逆序对。当逆序对为0,就说明已经满足有
快速排序
快速排序是一种就地排序,会改变输入数组,同时快速排序是一种不稳定的排序。快速排序的关键点是选择一个合适的轴点(`pivot`),这个选取的不确定性也导致了每次数据的分割是不均匀的。
对于选取的一个轴点,其左边的都不大于轴点,右边的都不小于轴点:
[low, pivot-1] <= pivot <= [pivot+1, high]
// [left, right)
void quickSort(std::vector<int>& arr, int left, int right) {
if(right - left <=1) // [left, left+1) ,只是剩下一个元素就是有序的
return;
int pivot = __partation(arr, left, right-1);
quickSort(arr, left, pivot);
quickSort(arr, pivot+1, right);
}
partition 算法,就是在扫描数据的过程中,将所有大于轴点的数据放到轴点右边,将所有小于轴点的数据放到左边。而quickSort算法就是不断的分割,当只有一个数据时,其本身就是有序,再将所有的子问题组合起来,