快速排序

快速排序跟冒泡排序都是交换排序方法,但不同的是快速排序速度非常快,它的实现思路是这样的,从带排序的数据序列中任取一个数据作为分界值,比它小的数据元素放在左边,比他大的元素放在右边。经过一趟下来之后就形成了左右两个子序列,左边元素值比分界值小,右边元素值比分界值大,接下来对左右两个子序列进行递归,对两个子序列重新选择中心元素并按照此规则进行调整。

在李刚写的一本书上是这样描述这个过程的,我觉得非常清楚,所以给大家分享一下,

1.选出指定的分界值。

2.将所有比分界值小的元素放在元素左边。

3.将所有比分界值大的元素 放在右边。

现在问题是怎么是实现第二步和第三步。过程如下

1.定义一个变量i,i变量从左边第一个索引开始,找大于分界值元素的索引,并用i来记录他。

2.定义一个变量j,变量j从右边第一个索引开始,找到小于分界值元素的索引。并用j记录它。

3.如果i<j则交换两个索引处的元素。

下面是实现过程

package com.demo;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * Created by wk on 2014/6/26.
 */
public class QuickSort {

    //插入排序
    public static void main(String args[]) {
        int[] older_arr = getArray(10);
        System.out.println("未排序:");
        display(older_arr);
        int[] new_arr = quickSort(older_arr, 0, older_arr.length - 1);
        System.out.println("排序后:");
        display(new_arr);

    }

    static int[] quickSort(int[] sorts, int start, int end) {
        //将左边的第一个值作为分界值
        if (start < end) {
            int base = 0;
            base = sorts[start];
            //从左边开始搜索大于分界值的元素索引
            int i = start;
            //从右边开始搜索,搜索小于分界值的索引
            int j = end + 1;
            while (true) {
                while (i < end && sorts[++i] >= base) ;
                while (j > start && sorts[--j] <= base) ;
                if (j > i) {
                    int tem = sorts[i];
                    sorts[i] = sorts[j];
                    sorts[j] = tem;
                } else {
                    break;
                }

            }
            int tem = sorts[start];
            sorts[start] = sorts[j];
            sorts[j] = tem;
            //递归左集合
            quickSort(sorts, start, j - 1);
            //遍历右集合
            quickSort(sorts, j + 1, end);
        }

        return sorts;
    }

    public static void display(int[] arrays) {
        for (Integer i : arrays)
            System.out.print(i + ",");
    }

    //获取不重复随机数
    public static int[] getArray(int n) {
        List<Integer> list = new ArrayList<Integer>();
        int[] ins = new int[n];

        for (int i = 0; i < n; i++) {
            int number = new Random().nextInt(1000);
            if (!list.contains(number)) {
                list.add(number);
                ins[i] = number;

            }
        }
        return ins;
    }
}
快速排序是排序里面速度最快的,但也是最不好理解的,涉及到了分治法和递归的思想。   在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来,且在大部分真实世界的数据,可以决定设计的选择,减少所需时间的二次方项之可能性。

帮助理解下这是快排的一个动画

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值