交换排序之快速排序

原创 2016年06月01日 12:38:14

应用交换排序思想的另一种经典排序算法是快速排序,快速排序的思想可以大致分成两大部分,一部分是利用分治策略的递归算法,另一部分是根据随机选择元素作为基准对整个数组进行的划分。算法先实现对数组进行划分,分成两个子数组,左边的子数组元素都比基准元素小,右边的子数组元素都比基准元素大。然后再对这两个子数组递归的进行划分,直到最后数组中只剩下一个元素。

数组划分

我们使用一个例子来说明对数组的划分过程
给定一个数组如下

这里写图片描述

选择第一个元素A[0]作为基准元素。X=A[0]

定义两个变量i=0,j=A.length1

这里写图片描述

如果i<j,首先判断A[j]与基准X的大小关系,例子中有A[9]>X,则该元素比基准大,放在基准后面不动,只需将jj运算向前移一位。接着判断A[j]=A[8]=48<72,小于基准的数应该放在前面,因此我们做A[i]=A[j]A[0]=A[8]=48,(这个时候不需要交换A[i]A[j],因为我们已经将A[0]作为基准保存起来了,即使A[0]元素被替换掉也没有关系)。然后将i向后移一位

这里写图片描述

到这里,数组中元素A[j]=A[8]已经被放到了第一个位置,所以我们这时候不移动j下标的愿意是因为后面如果找到比基准大的元素还要放在这里。
,下标i指向A[1]=6这个元素,将6与基准72比较,有6<72,比72小的元素就是放在前面的,所以不加操作继续将下标i后移,到57这个元素时的情况与6相同,继续后移i,到i=3时,有A[i]=88>72,做操作A[j]=A[8]=A[i]=A[3],则有

这里写图片描述

同样的,这里我们不再动下标i(因为这个元素已经被放到了后面,这个位置一会要放比基准小的本来在数组后面的元素)。向前移动下标j,到元素73位置处,有73>72,所以不做任何操作,再向前移动下标j83位置处还是同样的不动,直到下标j到达位置42位置处,发现42<72,做操作A[i]=A[3]=A[j]=A[5]

这里写图片描述

到这里之后同样的不再移动下标j(这个位置留着放前面过来的大于基准的元素),向后移动i到元素60的位置,因为60<72所以不做操作继续向后移动i,到这里之后有i=j=5不再满足i<j。此时将基准元素放在A[5]=72,完成划分并返回下标i,成功将数组划分成两个子数组。

递归调用

接下来有了对数组划分的算法之后,直接根据返回的两个子数组之间的划分下标两次递归调用这个数组划分算法,直到每个数组中都只剩下一个元素。

Java实现的代码如下

public class QuickSort {

    public static void main(String []args){
        int[]A={72,6,57,88,60,42,83,73,48,85};
        quickSort(A,0,A.length-1);

        for(int i=0;i<A.length;i++){
            System.out.println(A[i]);
        }
    }

    public static void quickSort(int[] A,int l,int r){      
        if(l<r){
            int X=A[l];
            int i=l;
            int j=r;
            while(i<j){
                while(i<j && A[j]>=X){
                    j--;
                }
                if(i<j){
                    A[i]=A[j];
                    i++;
                }
                while(i<j && A[i]<=X){
                    i++;
                }
                if(i<j){
                    A[j]=A[i];
                    j--;
                }
            }
            A[i]=X;
            quickSort(A,l,i-1);
            quickSort(A,i+1,r);
        }

    }

}

上述代码可以进行简单的简化,但是为了清楚的表达整个算法的过程,我没有对其进行调整。这样可以分别对应每一部操作过程来更清楚的理解快速排序的过程。
输出结果
这里写图片描述

LZ也是菜鸟一枚,正在努力学习中,如果哪里说的有错误的地方还劳烦大神指出来我会认真改正的哦

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

交换排序\快速排序

  • 2013-04-05 17:54
  • 22KB
  • 下载

第十六周 项目一(4)交换排序之快速排序

/* *Copyright (c) 2016,烟台大学计算机学院 *All rights reserved. *文件名称:main.cpp *作者:衣龙川 *完成日期:2...

交换排序—快速排序(Quick Sort)

基本思想: 1)选择一个基准元素,通常选择第一个元素或者最后一个元素, 2)通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的 元素值比基...

交换排序(快速排序 冒泡排序)

1.快速排序:先从数列中取出一个数作为基准数;分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边;再对左右区间重复第二步,直到各区间只有一个数。   以一个数组作为示例,取区间第...

交换排序(2)--快速排序3种实现方案及其优化

快速排序       快排的整体思想是找出一个key值,比key的值小的都在它的左边,比key大的值都在它的右边。这样就划分了左右两个区域,分别找左右两个区域的key值继续划分左右区间。   找中间值...

交换排序之快速排序

上一篇文章讲述了交换排序的一种,冒泡排序http://blog.csdn.net/majianfei1023/article/details/7289177,现在讲一讲选择排序的另外一种算法,快速排序...

17、java数组查找与交换排序及快速排序

简单的查找,从数组第一个元素开始,逐个与给定值比对,相等,返回数组下标,如果整个数组比对结束没有找到相等的,返回-1. 1、二分查找法(binary search):前提条件,待查找的元素要有序。 ...

交换排序:快速排序

快速排序(Quick Sort)也是一种交换排序,它在排序中采取了分治策略。 快速排序的主要思想是: 从待排序列中选取一元素作为轴值(也叫主元)。 将序列中的剩余元素以该轴值为基准,分为左右两部分。左...

交换排序—快速排序(Quick Sort)

交换排序—快速排序(Quick Sort) 1.基本思想 2.排序流程 2.1 基本流程 2.2 排序实例 3.算法实现 3.1 基本快速排序 3.2 算法改进 4.算法分析
  • wgiyq
  • wgiyq
  • 2017-01-16 14:50
  • 210

交换排序之----快速排序

快速排序是对冒泡排序的改进,是基于比较的内部排序方法中速度最快,也因此而得名。 基本思路:在待排序的数据中,任选一数据作为基准(通常选取第一个数据),把所有数据分为大于此数据和小余此数据的两部分,结...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)