快速排序的原理及JAVA实现

一.基本原理:

从待排数据序列中任取一个元素作为分界值(比如第一个),将所有比它大的放在右边,将所有比它小的放在左边,这样一次下来就得到了两个子序列,左边序列的数据元素的值都比临界值小,右边序列元素的值都比临界值大。将子序列也进行快速排序,如果排序还未完成,继续分成子序列进行快速排序,直到所有数据元素全部排序完成。   

二、实例                                                                                                                                                   

这样一趟快速排序的算法如下:

1.设置两个值i=0,j=N(数组的最大索引)

2.第一个数组元素的值作为关键数据赋给key,key=a[0]

3.从j开始向前搜索,即从j开始通过j=j-1向前搜索,当遇到a[j]<key,交换两值。

4.从i开始向后搜索,即从i开始通过i=i+1向后搜索,当遇到a[i]>key,交换两值。

5.重复3.4步,直到i=j。

实例讲解:(升序)5.3,9,7,6,2,8,4,1将5赋给key

待排序的数组为

通过讲解的步骤开始运行

key=a[0]=5   j=8向前搜索,当搜索到j=8时a[j]<key,交换两值

a[ ]012345678
139762845

i=0向前搜索,当搜索到i=2时a[i]>key,交换两值

a[ ]012345678
135762849

然后重复3、4步

134762859
134562879
134265879
134256879

现在完成第一次排序后,i=j=4;

这样我们就完成了一趟快速排序,接下来只要对临界值前后两个子序列,将(i=0,j=i-1)和(i=j+1,j=N)作为两个新的序列进行快速排序

也就是子序列

1342

和子序列

6879

如果还未排序完毕,可再次将子序列分成新排序进行再次排序,直到排序完毕

第二次排序后:

134256879

第三排序后:

123456789

排序完成

三、代码实现

我们发现,在实现排序的过程中我们用到了分而治之的思想,就是把大的转化成小的,把小的转化成更小的进行处理排序,所有我们在代码实现的过程中用到了递归进行分化,具体快速排序的java实现如下:

public class C {
    public static void main(String[] args) {
        int[] a = {5, 3, 9, 7, 6, 2, 8, 4, 1};
        quickSort(a, 0, a.length - 1);
        for (int i : a) {
            System.out.print(i + " ");
        }
    }

    public static void quickSort(int[] a, int start, int end) {
        int i = start;
        int j = end;
        if (i >= j) {//如果i>=j说明前后两端已经向中间交换完毕,已经完全排好了序
            return;
        }
        boolean flag = true;//规定方向,从左往右为真,反则为假
        while (i != j) {//当左右相等时,左右分为两堆,左堆为较小,右堆为较大的
            if (a[i] > a[j]) {
                int tmp = a[i];
                a[i] = a[j];
                a[j] = tmp;
                flag = !flag;//交换时转换方向
            }
            if (flag) {//如果为真,则向前一位搜索(j--)
                j--;
            } else {//如果为真,则向后一位搜索(i++)
                i++;
            }
        }
        //进行子序列的快速排序
        i--;
        j++;
        quickSort(a, start, i);
        quickSort(a, j, end);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值