快速排序

1. 快排理解--------“挖坑+填坑”+分治策略


     对于一个需要进行快排的数组arr[n],可以将其视为n块连续的地板,分别用left、right指向第1块和第n块地板,设pivot为基

准,pivot=arr[left]。 i=left, j=right;当(i<j)时,pivot=arr[left]表示挖掉了第(i+1)块地板(数组下标从0开始,故加1);然后从第j块

地板开始向前遍历,如果arr[j]>pivot,则j--;当arr[j]<=pivot时,将该地板挖掉,并且填补到上述左边被挖掉的坑里, 即arr[i]。

如此循环,最后循环结束时,有i==j,此时arr[i]所代表的地板已被挖掉,所以将基准pivot填补到该处,第一次排序结束。

     且快排满足分治策略---------当每个分区中均值存在一个元素时。
    
    可分为2个子问题,即左边部分和右边部分,最后利用递归得出结果。

2.算法思想:

a. 找基准pivot,可以是任意一个元素,本文默认pivot为数组第一个元素;

        b. “挖坑+填坑”,将大于pivot的元素放置右边,小于pivot的元素放置左边;

      c. 再对左右两个分区分别执行b步骤,直至每个分区中均只存在一个元素


3. 时间复杂度:

     最差时间复杂度:    O(n^2)

     最有时间复杂度:    O(nlogn)

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

     最差时间复杂度:    格局实现的方式不同而不同

4.  源代码:  

public class QukSort {
	public static void main(String[] args) {
		int[] arr = { 9, -4, 0, 32, 22, 100, -55, -32, 21, 54, 88, 77, 555, 43, -666 };
		
		quickSort(arr, 0, arr.length - 1); // 快速排序

		System.out.println("快速排序后:");
		for (int k = 0; k < arr.length; k++) {
			System.out.print(arr[k] + "  ");
		}
		System.out.println();
	}

	private static void quickSort(int[] arr, int left, int right) {
		int i = left;
		int j = right;
		int pivot = arr[left]; // pivot作为基准数
		while (i < j) {
			while (i < j && arr[j] > pivot) {
				j--;
			}
			if (i < j) {
				arr[i] = arr[j];
				i++; // 减少一次比较
			}

			while (i < j && arr[i] < pivot) {
				i++;
			}
			if (i < j) {
				arr[j] = arr[i];
				j--; // 减少一次比较
			}
		}
		arr[i] = pivot;

		if(left
    
    




当然,若在java语言中使用快排时,由于封装好的缘故,直接调用即可-------Arrays.sort();


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值