快速排序及Java实现

1.排序思路

快速排序是由冒泡排序改进而得,它的基本思想是:在待排序的n个元素中,任取一个元素(通常第一个)作为基准,把该元素放入适当位置后,数据序列被此元素划分为两个部分,把关键字小于该元素的元素放在前一部分,把关键字大于该元素的元素放在后一部分,并把该元素排在这两部分中间(称为该元素归位),这个过程叫做一趟快速排序。之后对两个子部分用递归的方法继续划分。

具体做法(以第一个元素为基准为例):

1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;

5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。

 

2.Java实现

//快速排序,以数组第一个元素为基准
	public static void quickSort1(int[] a,int low,int high){
		int i=low;
		int j=high;
		
		if(low<high){//因为后面要递归调用quickSort1方法,这是递归的终止条件,这一句必不可少!
			int tmp=a[low];//注意tmp的位置,不能在if语句外定义!
			//循环结束的条件为i==j
			while(i!=j){
				while(i<j && a[j]>=tmp)
					j--;
				if(i<j)
					a[i]=a[j];
				while(i<j && a[i]<=tmp)
					i++;
				if(i<j)
					a[j]=a[i];
			}
			a[i]=tmp;
			quickSort1(a,low,i-1);
			quickSort1(a,i+1,high);
		}
	}
	
	//快速排序,以数组中间元素为基准
	public static void quickSort2(int[] a,int low,int high){
		int i = low;
		int j = high;
		
		if(low<high){
			int mid = (low+high)/2;
			int tmp = 0;
			//循环结束条件仍为i==j
			while(i!=j){
				while(i<j && a[j]>a[mid])//注意必须是a[j]>a[mid],不能有等于号
					j--;
				while(i<j && a[i]<a[mid])
					i++;
				if(i<j){
					tmp=a[i];
					a[i]=a[j];
					a[j]=tmp;
				}
			}
			quickSort2(a,low,i-1);
			quickSort2(a,i+1,high);
		}
	}

 

3.算法分析

 时间复杂度:最好情况O(nlog2n),最坏情况O(n2),平均情况O(nlog2n)。

 空间复杂度:O(log2n)。

 快速序是不稳定的。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值