交换排序之快速排序

原创 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也是菜鸟一枚,正在努力学习中,如果哪里说的有错误的地方还劳烦大神指出来我会认真改正的哦

数据结构实验之排序二:交换排序

数据结构实验之排序二:交换排序 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 冒泡...
  • guoqingshuang
  • guoqingshuang
  • 2015年12月20日 18:55
  • 1706

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

快速排序
  • csdn_chb
  • csdn_chb
  • 2016年11月22日 15:39
  • 356

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

基本思想通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行分割,直到所有的数据都呈有序排列为止。其基本思路如下图所示...
  • u012434102
  • u012434102
  • 2015年05月11日 21:20
  • 290

【排序三】交换排序(冒泡排序&&快速排序)

【排序一】插入排序(直接插入排序&&希尔排序) 【排序二】选择排序(选择排序&&堆排序) 一、冒泡排序 1、基本思想     冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简...
  • snow_5288
  • snow_5288
  • 2017年03月04日 21:45
  • 2005

数据结构例程—— 交换排序之快速排序

本文是[数据结构基础系列(9):排序]中第5课时[ 交换排序之快速排序]的例程。1.以第1个元素作为基准#include #define MaxSize 20 typedef int KeyType...
  • sxhelijian
  • sxhelijian
  • 2015年11月30日 15:37
  • 1807

3399 数据结构实验之排序二:交换排序

数据结构实验之排序二:交换排序#include using namespace std; int a[100100]; int b[100100]; int cnta,cntb; ...
  • yue_luo_
  • yue_luo_
  • 2016年12月11日 21:52
  • 271

交换排序之--冒泡排序,快速排序

冒泡排序是一种很经典的排序方式了,当然他也是最简单的一种交换式排序,冒泡排序的思想很简单,从前面开始,每每两个数相比,如果前面的大于后面的则交换位置,知道最后一个数,这样一轮排序下来,最大的数就跑到了...
  • zcxwww
  • zcxwww
  • 2016年05月17日 18:57
  • 452

交换排序之--快速排序

#include int Partition( int A[], int length, int low, int high) { if(A==NULL|| le...
  • u010726692
  • u010726692
  • 2017年08月03日 13:49
  • 74

交换排序之快速排序

快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部...
  • Quex_Jqx
  • Quex_Jqx
  • 2014年09月16日 16:44
  • 356

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

和归并排序一样,快速排序也是一种分治的递归算法。 快速排序的思想是:选取一个枢纽元,将比枢纽元小的元素放枢纽元前面,把比枢纽元小的元素放后面,然后将前面的集合,后面的集合,重复之前的步骤。 枢纽元...
  • wz1226864411
  • wz1226864411
  • 2017年08月23日 22:12
  • 77
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:交换排序之快速排序
举报原因:
原因补充:

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