5.快速排序
基本思想:一趟把数据分成俩个部分,第一个部分所有的数据都比第二个部分所有的数据小,每一趟都按照之前的那种思想,把前一个部分也化成俩部分,后面一部分也化成俩部分,依次递归下去...
个人理解的快速排序有俩种算法
目录
单向指针扫描法:
思想:意思是只有一个指针是主动扫描,这个指针所指向的数据和某个数据进行比较,如果大于某个固定数字,就把该数据放到后面,如果小于某个数据,该指针直接移向下一个数据,再进行比较。然后再进行递归的把左右划分好的区间再一次进行比较。
所以该方法将使用一个循环,使指针移动,完成一次数据风格,然后递归
具体核心代码如下:
void kuaipaione(int a[max],int p,int r){//5
int q;
int pivot;//固定对比数据
int right;//被动移动的指针
int sp;//移动比较的指针
if(p<r){
pivot=a[p];
right=r;
sp=p+1;
while(sp<=right){//指针开始移动
if(a[sp]<=pivot){//如果小于固定数据指针下移
sp++;
}else{
swap(a,sp,right);//大于把这个数放到后面
right--;//范围缩小
}
}
swap(a,p,right);//right指针指向的位置就是固定数据应该在的位置
q=right;
kuaipaione(a,p,q-1);//缩小范围进行下一次递归
kuaipaione(a,q+1,r);
}
}
小结:每当sp指针数和right交换的时候,right必须减1,缩小范围,使sp和right不断靠近,直到sp>right这个时候right指向就是整个数据被pivot分成俩个部分的中间位置,再把pivot放到中间位置,一趟就完成,接下来就是递归,边界不包含right所在的数据
双向指针扫描法:
思想:故名思意就是有一左一右俩个指针双向和固定数据pivot进行比较,如果左边数据>pivot并且右边数据<pivot,就将俩边的数据进行交换同时俩个指针相向移动,直到左右俩个指针交错,才结束一趟,接下来依次对左右俩个区域进行递归...
双向比单向多了一个指针,算法的复杂度更高,但是效率更快
具体核心代码如下:
void kuaipaitwo(int a[max],int p,int r){//6
int q;
int pivot;//固定数据
int left;//左指针
int right;//右指针
if(p<r){
pivot=a[p];
left=p+1;
right=r;
while(left<=right){
while(left<=right&&a[left]<=pivot){//左指针小于pivot不用交换
left++;
}
while(left<=right&&a[right]>pivot){//right大于pivot不用交换
right--;
}
if(left<=right){//当左大pivot并且右小于pivot相互交换
swap(a,left,right);
}
}
swap(a,p,right);//出循环时候right指向依然是数据分开位置,把pivot放right上面
q=right;
kuaipaitwo(a,p,q-1);//递归
kuaipaitwo(a,q+1,r);
}
}
小结:刚开始left>right当出循环的时候,right所在位置左边数据都比右边数据小,然后把right位置上面的数据和pivot交换,依次递归。
喜欢看的朋友记得点个关注哟!