快排的核心是定位大小,不在意顺序,先确定第一个数字的位置,遍历数组将小于等于该数值的放在左边,大于的放在右边。具体如下:
int i=left;
int j=right;
int p=num[left];
while (i<j){
while (i<j&&num[j]>p)j--;
while (i<j&&num[i]<=p)i++;
change(num,i,j);
}
这里的change是自己实现的交换方法为:
public void change(int[] num,int i,int j){
int temp=num[i];
num[i]=num[j];
num[j]=temp;
}
这一步就会把比第一个数字大的和小于等于它分开了,但现在还有一个问题,参照的数字仍然在第一个,比如原来的顺序为4 1 6 2 3
经过排序后成为了
4 1 3 2 6
↑
i
i指向的不是我们比对的数字,所以我们要和第i位进行交换,成为:
2 1 3 4 6
↑
p
int i=left;
int j=right;
int p=num[left];
while (i<j){
while (i<j&&num[j]>p)j--;
while (i<j&&num[i]<=p)i++;
change(num,i,j);
}
change(num,i,left);
现在第一个需要比对的数字位置已经定好了,就可以对它的左右两边进行相同的排序,这里使用递归,递归结束的判断条件为i指向的位置大于或者等于j指向位置,这代表着所有的数字都已经定位完成。
最终代码如下:
public void quick(int[] num,int left,int right){
if(left>=right)return;
int i=left;
int j=right;
int p=num[left];
while (i<j){
while (i<j&&num[j]>p)j--;
while (i<j&&num[i]<=p)i++;
change(num,i,j);
}
change(num,i,left);
quick(num,left,i-1);
quick(num,i+1,right);
}
public void change(int[] num,int i,int j){
int temp=num[i];
num[i]=num[j];
num[j]=temp;
}

10万+

被折叠的 条评论
为什么被折叠?



