2 .对于右侧序列来说,先用K储存a[low]=8我们先从右侧找到第一个小与8的数字4。
3 .我们将它放到low位置替换,然后从low位置向右找到第一个大于k=8的再同样放到右侧。我们找到9,把9赋值给high位置。
4 .重复上面步骤直到high
5 .就这样重复下去,直到整个序列有序即可!
代码
在书写代码的时候,要注意一些顺序,防止数组越界情况,可以写好debug一遍其实就很好理解了!当写代码遇到错误时候,不要急着就去找正确答案,能有时间自己发现错误,可以借助断点查看程序执行流程,这样对自己的收益是最大的!
至于快排的代码,是这样的:
private static void quicksort(int [] a,int left,int right)
{
int low=left;
int high=right;
//下面两句的顺序一定不能混,否则会产生数组越界!!!very important!!!
if(low>high)//作为判断是否截止条件
return;
int k=a[low];//额外空间k,取最左侧的一个作为衡量,最后要求左侧都比它小,右侧都比它大。
while(low<high)//这一轮要求把左侧小于a[low],右侧大于a[low]。
{
while(low<high&&a[high]>=k)//右侧找到第一个小于k的停止
{
high--;
}
//这样就找到第一个比它小的了
a[low]=a[high];//放到low位置
while(low<high&&a[low]<=k)//在low往右找到第一个大于k的,放到右侧a[high]位置
{
low ;
}
a[high]=a[low];
}
a[low]=k;//赋值然后左右递归分治求之
quicksort(a, left, low-1);
quicksort(a, low 1, right);
}
测试与总结
对于完整的代码,为
package 八大排序;
import java.util.Arrays;
public class 交换类排序 {
public static void main(String[] args) {
int a[]= {2,8,9,3,7,6,12,4};
maopaosort(a);
System.out.println(Arrays.toString(a));
int b[]= {2,8,9,3,7,6,12,4};
quicksort(b, 0, b.length-1);
System.out.println(Arrays.toString(b));
}
private static void maopaosort(int[] a) {
// TODO Auto-generated method stub
for(int i=a.length-1;i>=0;i--)
{
for(int j=0;j<i;j )
{
if(a[j]>a[j 1])
{
int team=a[j];
a[j]=a[j 1];
a[j 1]=team;
}
}
}
}
private static void quicksort(int [] a,int left,int right)
{
int low=left;
int high=right;
//下面两句的顺序一定不能混,否则会产生数组越界!!!very important!!!
if(low>high)
return;
int k=a[low];//取最左侧的一个作为衡量,最后要求左侧都比它小,右侧都比它大。
while(low<high)
{
while(low<high&&a[high]>=k)
{
high--;
}
//这样就找到第一个比它小的了
a[low]=a[high];
while(low<high&&a[low]<=k)
{
low ;
}
a[high]=a[low];
}
a[low]=k;
quicksort(a, left, low-1);
quicksort(a, low 1, right);
}
}
运行结果: