快速排序

快速排序:该算法是在数组中选择一个元素作为主元(pivot),将数组分为两部分,前部分所有元素小于等于主元,后部分所有元素大于主元。对第一部分递归地应用快速排序算法,然后对第二部分递归地应用快速排序算法。

/*快速排序清单*/
public class QuickSort {
	public static void quickSort(int[] list){
		quickSort(list,0,list.length-1);
	}
	private static void quickSort(int[] list,int first,int last){
		if(last>first){
			int pivotIndex=partition(list,first,last);//主元的下表
			quickSort(list,first,pivotIndex-1);//对主元前边的部分快速排序
			quickSort(list,pivotIndex+1,last);//对主元后边的部分快速排序
		}
	}
	private static int partition(int[]list,int first,int last){//整个方法结束时返回主元的下标
		int pivot=list[first];    //选择第一个元素作为主元
		int low=first+1;//low指向数组第二个元素
		int high=last;//high指向数组最后一个元素
		while(high>low){
			while(low<=high&&list[low]<=pivot)//从左侧开始找第一个大于主元的元素
				low++;
			while(low<=high&&list[high]>pivot)//从右侧开始找小于等于主元的元素
				high--;
			if(high>low){//交换这两个元素
				int temp=list[high];
				list[high]=list[low];
				list[low]=temp;
			}
		}
		while(high>first&&list[high]>=pivot)
			high--;
		if(pivot>list[high]){//如果主元被移动,返回将数组分为两部分主元的新下标
			list[first]=list[high];
			list[high]=pivot;
			return high;
		}
		else{//否则返回原始下标
			return first;
		}
	}
	public static void main(String[] args) {
		int[] list={2,3,2,5,6,1,-2,3,14,-12};
		quickSort(list);
		for(int i=0;i<list.length;i++)
			System.out.print(list[i]+"  ");
	}
	
}
归并排序和快速排序都使用了分治法,对于归并排序,大量的工作是将两个子线性表进行归并,归并是在子线性表排好序后进行的;对于快速排序,大量工作是将线性表划分为两个子线性表,划分是在子线性表排好序前进行的。在最差情况下,归并排序的效率高于快速排序,但是,在平均情况下,两者效率相同。归并排序在归并两个子数组时需要一个临时数组,而快速排序不需要额外的数组空间,因此,快速排序的空间效率高于归并排序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值