/*
分治法
选择一个值 作为中间值
中间值 左边的数 小于它
中间值 右边的数 大于他
*/
/*
l low
h high
*/
void quicksort(int a[],int l,int h)
{
/*
结束条件
当左边的指针等于右边的指针时
返回
*/
if(l>=h)
return ;
int i=l,j=h;
int index = a[l];
while(i<j)
{
/*
在右边
判断 值 和 index关系
找到 一个 比index小的值
*/
while(i<j&&a[j]>=index)
{
j--;
}
/*
将右边的值赋值到当前已保存的左边的数组
左边的指针向右平移
*/
if(i<j)
{
a[i++]=a[j];
}
/*
在左边
判断 值 和 index 的关系
找到 一个 比index 值 大的数
*/
while(i<j&&a[i]<index)
{
i++;
}
/*
将左边的值赋给右面指针指向的值
右边指针当前指向的值
为 已知的 比index小的值
右边的指针向左平移
*/
if(i<j)
{
a[j--]=a[i];
}
}
//将选定的值存放在它有序的位置
a[i]=index;
// 安排 该值左边的值
quicksort(a,l,i-1);
// 安排该值右边的值
quicksort(a,i+1,h);
}
这里解释下面三行代码中的 " i<j "
while(i<j)
while(i<j&&a[j]>index)
if(i<j)
这段代码 :
while(i<j&&a[i]>=index)
if(i<j)
为什么上面有判断 i<j 还while(i<j&&a[i]>=index)
这是一个循环,判断j--后与 i 的关系
之后的if(i<j)
判断上面的while(i<j&&a[i]>=index)终止的原因
存在一种情况:
你挑选的值本来的位置就在最左边或者最右边
这时候不需要交换任何位置