快速排序

问题描述:
对数组进行升序排序,
源代码:

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));//打印数组排序后的状态

}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值