/*
* 快速排序
* 这里也写两个吧,一个是以中间的数为轴进行分割,一个是以开头为分割
*1.第一个是right和left都找的一个数的时候才交换,
* 这时就得考虑到如果left和right有一边已经来到中间这个数的情况
* 1.1 在这之前还得注意一下"number[indexright]>middle"这个条件,因为它可能会来到中间,
* 而且当前面出现了和中间值相同的时候,这是位置指针就不能继续走了,
* 举个例子,就好比如你来到中间,如果你有等于的话就会跳过中间值走下去,
* 然后后面的还继续比中间值小,这时候就会出现问题了,所以不能有等号
*/
public int[] QuickSort(int[] number)
{
if(number.length>0)
{
int left=0;
int right=number.length-1;
return QuickSort(number, left, right);
}
return null;
}
/*
* 先不解析,我自己也乱,不知道自己写了什么
*/
/*
public int[] QuickSort1(int[] number,int left,int right)
{
int indexleft=left;
int indexright=right;
int middle=number[(left+right)/2];
int temp;
while(indexleft<indexright)
{

while(number[indexright]>middle)
{
indexright--;
}
while(number[indexleft]<middle)
{
indexleft++;
}
if(indexleft==indexright)
{
break;
}
temp=number[indexleft];
number[indexleft]=number[indexright];
number[indexright]=temp;
if(number[indexleft]==middle)
{
indexright--;
}
if(number[indexright]==middle)
{
indexleft++;
}
}
if(indexleft==indexright)
{
indexleft++;
indexright--;
}
if(indexright>left)
{
QuickSort1(number, left, indexright);
}
if (indexleft < right)
{
QuickSort1(number, indexleft, right);
}
return number;
}
*/
/*
* 思路:就是我们以第一个数字作为中间值
* 这里再解释一波:
* 这里时先在右边找到一个比中间值小的,然后就直接将它放在start的位置
* 然后同理去左边找,将它放在end位置,这时候就会空出start位置,而且符合
* start左边全部小于中间值,右边全部大于中间值
* start就是中间值的位置,将它放进去
* 然后判断左右边是否还需要递归,该递归那就递归那
*/
public int[] QuickSort(int[] number,int start,int end)
{
int uperstart=start;
int uperend=end;
int temp=number[start];
while(start<end)
{
while(start<end&&number[end]>=temp)
{
end--;
}
number[start]=number[end];
while(start<end&&number[start]<=temp)
{
start++;
}
number[end]=number[start];
}
number[start]=temp;
if(uperstart<start-1)
{
QuickSort(number, uperstart, start-1);
}
if(uperend>start+1)
{
QuickSort(number, start+1, uperend);
}
return number;
}