快速排序
快速排序是冒泡排序的一种改进,也属于交换排序,通过元素之间的比较和交换位置来达到排序的目的。
但是冒泡排序再每一轮只把一个元素冒泡到竖列的一段,而快速排序再每一轮挑选一个基准元素,并让其他比它大的元素移动到数列的一旁,从而把数列拆成了两个部分。
挖坑法
顾名思义,挖坑发就是从右边取一个基准值用于比较数的key,取走的这个数的位置就成为了一个坑,再左边找比key大的数,然后再将这个数填在刚才取走的数的位置。
左右指针法
(1)取一个关键字key作为枢轴,一般取第一个数/最后一个数。
(2)设置两个变量left和right分别是0和n-1。
(3)从left一直向右走,找到一个大于key的值,right从后往前走,找到一个小于key的数,然后交换两个数。
(4)重复这3步骤,一直往后找,知道left=right,这时将key放在left的位置上即可。
前后(快慢)指针法
前后指针法(快慢指针法)是定义两个指针,一个cur指向数组第一个元素位置,pre指向cur前一个位置,选取最右边的元素key,比较cur指向的元素是否小于key,如果小于,pre后移一个位置,并和cur所指向的位置的元素进行交换,然后cur后移一个位置,以此类推。
代码实现
int partition(int l,int r){
int temp=A[l];
while(l<r){
while(l<r && A[r]>temp)
r--;
A[l]=A[r];
while(l<r && A[l]<=temp)
l++;
}
A[l]=temp;
return l;
}
void quicksort(int l,int r){
if(l<r){
int pos=partition(l,r);
quicksort(l,pos-1);
quicksort(pos+1,r);
}
}