问题描述:
对数组进行升序排序,
源代码:
public class 快速排序 {
public static int 交换次数=0;
static void quicksort(int a[],int p,int r) {
if(p<r)//子序列长度大于等于2,子问题仍存在,继续调用
{
int q=partition(a,p,r);//获得基准元素下标,同时基准左侧<基准,基准右侧>基准
quicksort(a,p,q-1);//以基准为界划分为两个子(序列)问题,同时调用函数处理子问题
quicksort(a,q+1,r);
}
}
static int partition(int a[],int p,int r) {//返回基准元素下标,同时使得基准左侧<基准,基准右侧>基准
int i=p,j=r+1;
int x=a[p];//默认以当前子序列第一个元素为被比较值
while(true) {
while(a[++i]<x&&i<r);//从左至右寻找大于基准元素值的下标位置
while(a[--j]>x);//从右至左寻找大于基准元素值的下标位置
if(i>=j) break;//i>=j时说明已经遍历一遍子序列,结束循环
System.out.print(a[i]+"与"+a[j]+"交换后:");
swap(a,i,j);//每当两侧的寻找都有新的下标,交换一次
System.out.println(show(a));//展示数组当前状态
}
System.out.print(x+"与"+a[j]+"交换后:");//此时的a[j]以左(包括a[j])小于基准元素值x,以右大于x
a[p]=a[j]; //a[j]以左(包括a[j])小于基准元素值x,所以交换x和a[j],即交换a[p]和a[j]
a[j]=x;
System.out.println(show(a));
return j; //返回基准元素下标
}
public static void swap(int a[],int k,int i) {
int temp=a[k];
a[k]=a[i];
a[i]=temp;
}
static String show(int a[]) {//用于打印输出数组的方法
String s="";
for(int x:a)
s=s+x+" ";
return s;
}
public static void main(String args[]) {//主函数
int a[]=new int[]{3,9,6,7,4,5,1,0,2,8};//待排序数组
System.out.print("排序前: ");
System.out.println(show(a));//打印数组初始状态
quicksort(a,0,9);//调用排序函数
System.out.print("排序后: ");
System.out.print(show(a));//打印数组排序后的状态
}
}