理解快速排序
1.对快速排序的理解
快排运用了分治的思想
举个例子说明分治
假设省长要给xx全省修路,省长把各市长叫过来说你去修路吧。修路的范围是我们省
然后市长又跟县长说,你们去修路吧 修路的范围是我们市
……
最后无数农民工,他们再想向下吩咐的时候一看,哦豁,我就是最底层,把自己面前的路修好吧。
2.快排步骤
假设对区间 left 到 right 进行划分
(1).把区间最左边作为标兵,两个指针从两端开始向中间相向而行
右指针遇到比标兵小的,和左指针遇到的比标兵大的交换
注意!!右指针先动,这样可以保证相遇时,相遇的位置的值小于标兵值
(2).相遇后的位置,位置左边的数都小于标兵的值,位置右边的数都大于标兵的值,位置上的值也小于标兵的值
因此,交换标兵和当前位置的值
(3)假设界限的下标为 j 左右两边继续划分操作
左边的区间变成 left和 j-1
右边的区间变成 j+1 和 right
3.分析代码
//交换操作,这就不多说了
void Swap(int arr[],int i,int j)
{
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
int qsort(int arr[],int left,int right)
{
if(left>=right) //当left==right时,说明当前区间只有一个值,该干的干完了,不用往下了
return 0;
int num=arr[left]; //标兵的值
int i=left; //左移动指针
int j=right; //右移动指针
while(i<j) //左右指针相碰时,划分操作结束,而相遇时的位置就是下一次划分的界限
{
//重点!右边先开始扫
while(arr[j]>=num&&j>i) j--; //从右边扫找到第一个小于标兵的点
while(arr[i]<=num&&i<j) i++; //从左边扫找到第一个大于标兵的点
Swap(arr,i,j); //交换他们
}
Swap(arr,left,j); //两指针相遇后,就找到了下一次划分的界限,把找到的分界线上的值和标兵换一下
qsort(arr,left,j-1); //分界线左边继续划分
qsort(arr,j+1,right); //分界线右边继续划分
}
没找到合适的画图软件,而且画图丑的很,所以还是有点抽象,如果配上图就好多了,等我考完研就来改进。