快速排序

一、算法思想:“分而治之的思想”,

(1)在待排序列中,选择一个基准元素(一般选择第一个数或最后一个)

(2)依据基准元素,将序列分成两个子序列,小于等于基准元素的放在左边,大于基准元素的放在右边。

(3)合并两个子序列(合并后不需要整体排序,因为之前分别是有序的)

(4)递归堆两个子序列进行递归排序,直到序列只有一个元素为止。

二、代码如下:

import java.util.Arrays;
public class QuickSort {
	public static void quickSort(int[] array,int low,int high){
		//数组不合法,返回
		if(low>=high){
			return;
		}
		int i=low;
		int j=high;
		int index=array[i];//标识基准元素
		while(i<j){
			//从后面开始遍历比index元素小的值
			while(i<j && array[j]>index) j--;
			//出循环时要么i>j,要么当前元素小于index,然后移动
			if(i<j) array[i++]=array[j];
			//从前面开始遍历比index元素大的值
			while(i<j && array[i]<index) i++;
			//出循环时要么i>j,要么当前元素大于index,然后移动
			if(i<j) array[j--]=array[i];
		}
		//将index放回数组的空位
		array[i]=index;
		quickSort(array,low,i-1);
		quickSort(array,i+1,high);
		
	}
	public static void main(String[] args){
		int[] array={4,7,3,2,8,6,9,5};
		quickSort(array,0,array.length-1);
		System.out.println(Arrays.toString(array));
	}

}

三、时间复杂度:O(nlogn)

四、空间复杂度:O(logn),快速排序时借助一个栈空间实现递归,当划分区间均匀时,递归树的深度为logn+1,logn向上取整,当刚好划分为一边区间刚好为0时,递归树的深度为n,每次排序后最好记录一下基准元素两边的个数,然后从多的一边开始排序,栈的深度可降为logn,

五、不稳定的排序算法,n较大时效率高,待排序列基本有序时退化为冒泡排序;

六、归并排序和快速排序的异同点:

相同:都是“分而治之”的思想,将待排序列分为两组,分别对两组进行排序,然后将这两个组进行合并。

不同:分组策略和合并策略不同。归并排序的分组策略:将待排序列直接按个数分为两组,前面一半作为一组,后面一半为另一组。合并策略:将两个子序列进行合并排序。 快速排序分组策略:选择一个基准元素,小于等于基准元素的为一组,大于基准元素的为另一组,合并策略:因为快速排序分组时已经根据元素大小分组了,所以合并的时候直接合并就好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值