十大经典排序之快速排序①

介绍
快速排序(Quicksort)是对冒泡排序的一种改进。
快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
实现原理
1.任意找数组中的一个数字作为参照数,用这个数做分界值。

/**
	 * 分区移动方法
	 * @param arr
	 * @param low
	 * @param high
	 */
	private static int partition(int[] arr, int low, int high) {
        int pivot = arr[low];   // 参照数字默认为数组的第一个元素。
        int left = low; // 左指针指向最左侧。
        int right = high - 1;   // 右指针指向最右侧。
        while (left < right) {
            // 若右指针大于基准值,则左移。
            while (left < right && arr[right] >= pivot) {
                right--;
            }
            arr[left] = arr[right];
 
            // 若左指针小于基准值,则右移。
            while (left < right && arr[left] <= pivot) {
                left++;
            }
            arr[right] = arr[left];
        }
 
        //这里注意当左边和右边的指针移动第一次同时碰头的时候,说明没有搜寻到比基准数大或者小的值,这个位置就是基准数排序中的正确位置
        arr[left] = pivot;
 
        // 把每一趟排序的结果也输出一下。
        print(arr);
 
        // 返回基准值的索引。
        return left;
    }

2.对该数组从第一位和最后一位数字面对面向中间搜索
3.末尾的搜索先出发,每搜索一个数字和参照数进行比较。如果大于参照数,则右指针向左移。如果小于参照数,则右指针指向的数和此时左指针指向的数交换位置。
4.第一次左右两个指针同时指向一个数时,说明该数为参照数的正确位置,将该数与参照数交换位置。
5.参照数被放在正确的排序位置后,此时数组相当于被分为两个子数组。然后使用递归调用上面的比较方法,

	private static void quickSort(int[] arr,int low,int high) {
		 // 只有一个元素的话,则什么都不做。
        if (high - low <= 1)    return;
 
        // 分区。
        int partition = partition(arr, low, high);
 
        // 递归左右两个分区。
        quickSort(arr, low, partition);
        quickSort(arr, partition + 1, high);
	}

6.个人觉得快速排序就是把数组中的数字进行跳跃性交换(效率高),然后找到参照数的正确位置,每一个排序的数字都可以看成是一个参照数,知道最后分出来的子数组长度为1时返回。

	public static void quickSort(int[] arr) {
		if (arr == null || arr.length <= 1)
			return;
		quickSort(arr,0,arr.length);

	}

打印数组

	  // 打印数组
    public static void print(int[] arr) {
        if (arr == null)    return;
 
        for(int i : arr) {
            System.out.print(i + " ");
        }
        System.out.println();
    }

说了这么多,我表述可能也不是太清晰,直接上代码吧,不懂的最好方法就是拿起你手中的代码开始敲,多写两遍基本就懂了

测试

	public static void main(String[] args) {
		int[] arr= {6 ,1, 2, 7 ,9, 3, 4, 5, 10, 8};
		System.out.print("排序前");
		print(arr);
		System.out.println("--------------");
		quickSort(arr);
		System.out.print("排序后");
		print(arr);
	}

在这里插入图片描述
**

前跨一步,可能会发现一条意外的小路。生活如山路,向前跨一步,便可发现一条更好的路,使生活更充实,更有乐趣。—— 松下幸之助

**

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值