算法基础之排序篇-快速排序

1、算法描述
   快速排序是冒泡排序的一种改进。快速排序是通过一次排序将待排序列分成两部分,一部分小于等于基准数,一部分大于
等于基准数,再分别对两部分进行快速排序。
    一趟快速排序的操作步骤
       (1)、设置两个变量i和j,i=0,j=n-1。
       (2)、以data[0]为基准数,mark=data[0]
       (3)、j向前搜索(j--),找到第一个小于基准数mark的数data[j],交换data[j]与data[i]
       (4)、i向后搜索(i++),找到第一个大于基准数mark的数data[i],交换data[i]与data[j]
       (5)、重复(3)(4),直到i等于j
2、图例
   

3、代码

	public void sort(int[] data) {
		quickSort(data, 0, data.length - 1);
	}

	private void quickSort(int[] data, int begin, int end) {
		int i = partition(data, begin, end);
		if (i > begin)
			quickSort(data, begin, i);
		if (end > i + 1)
			quickSort(data, i + 1, end);
	}

	private int partition(int[] data, int begin, int end) {
		int mark = data[begin];
		while (begin != end) {
			while (data[end] >= mark && begin != end) {
				end--;
			}
			if (begin == end)
				break;
			swap(data, begin, end);
			while (data[begin] <= mark && begin != end) {
				begin++;
			}
			if (begin == end)
				break;
			swap(data, begin, end);
		}
		return begin;
	}

4、稳定性及复杂度
稳定性:快速排序是不稳定的排序。

平均时间复杂度:O(nlongn)

快速排序的最好情况发生在每次划分都将需要排序的序列分成大小相等的子序列时,时间复杂度为O(nlongn)

快速排序的最坏情况发生在每次划分都将需要排序的序列分成1和n-1大小的序列,时间复杂度为O(n^2)

空间复杂度:O(longn)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值