`
jackroomage
  • 浏览: 1217545 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

快速排序原理及java实现

 
阅读更多

快速排序是对冒泡排序的一种改进。它的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。最坏情况的时间复杂度为O(n2),最好情况时间复杂度为O(nlog2n)。

   假设要排序的数组是A[1]……A[N],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一躺快速排序。一趟快速排序的算法是:

  1)、设置两个变量IJ,排序开始的时候I=1J=N

  2)以第一个数组元素作为关键数据,赋值给X,即X=A[1]

  3)、从J开始向前搜索,即由后开始向前搜索(J=J-1),找到第一个小于X的值,两者交换;

  4)、从I开始向后搜索,即由前开始向后搜索(I=I+1),找到第一个大于X的值,两者交换;

  5)、重复第34步,直到I=J

  例如:待排序的数组A的值分别是:(初始关键数据X=49

                  A[1]    A[2]    A[3]    A[4]    A[5]     A[6]    A[7] 

                    49       38      65      97      76      13       27

进行第一次交换后:  27       38      65      97      76      13       49

                  ( 按照算法的第三步从后面开始找)

进行第二次交换后:  27       38      49      97      76      13       65

                 ( 按照算法的第四步从前面开始找>X的值,65>49,两者交换,此时I=3 )

进行第三次交换后:  27       38      13      97      76      49       65

( 按照算法的第五步将又一次执行算法的第三步从后开始找)

进行第四次交换后:  27       38      13      49      76      97       65

( 按照算法的第四步从前面开始找大于X的值,97>49,两者交换,此时J=4 )

     此时再执行第三步的时候就发现I=J,从而结束一躺快速排序,那么经过一躺快速排序之后的结果是:27       38      13      49      76      97       65,即所以大于49的数全部在49的后面,所以小于49的数全部在49的前面。

     快速排序就是递归调用此过程——在以49为中点分割这个数据序列,分别对前面一部分和后面一部分进行类似的快速排序,从而完成全部数据序列的快速排序,最后把此数据序列变成一个有序的序列,根据这种思想对于上述数组A的快速排序的全过程如图6所示:

 初始状态                       {49    38    65    97    76    13    27}   

进行一次快速排序之后划分为     {27    38    13}    49  {76    97    65}

分别对前后两部分进行快速排序   {13}   27   {38} 

                               结束        结束   {49   65}   76   {97}

                                                   49  {65}        结束

                                                       结束

                         6   快速排序全过程

 

1)、设有N(假设N=10)个数,存放在S数组中;

2)、在S[1。。N]中任取一个元素作为比较基准,例如取T=S[1],起目的就是在定出T应在排序结果中的位置K,这个K的位置在:S[1。。K-1]<=S[K]<=S[K+1..N],即在S[K]以前的数都小于S[K],在S[K]以后的数都大于S[K]

3)、利用分治思想(即大化小的策略)可进一步对S[1。。K-1]S[K+1。。N]两组数据再进行快速排序直到分组对象只有一个数据为止。

如具体数据如下,那么第一躺快速排序的过程是:

数组下标: 1     2     3     4     5     6     7     8     9     10

          45    36    18    53    72    30    48    93    15     36

          I                                                       J

1     36    36    18    53    72    30    48    93    15     45

2     36    36    18    45    72    30    48    93    15     53

3     36    36    18    15    72    30    48    93    45     53

4     36    36    18    15    45    30    48    93    72     53

5     36    36    18    15    30    45    48    93    72     53

通过一躺排序将45放到应该放的位置K,这里K=6,那么再对S[1。。5]S[6。。10]分别进行快速排序。

    /**

     * 交换指定数组a的两个变量的值

     * @param a 数组应用

     * @param i 数组下标

     * @param j 数组下标

     */

    public static void swap(int a[], int i, int j) {

       

        if(i == j) return;

 

        int tmp = a[i];

 

        a[i] = a[j];

 

        a[j] = tmp;

 

    }

 

    /**

     *

     * @param array 待排序数组

     * @param low 数组下标下界

     * @param high 数组下标上界

     * @return pivot

     */

    public static int partition(int array[], int low, int high) {

        //当前位置为第一个元素所在位置

        int p_pos = low;

        //采用第一个元素为轴

        int pivot = array[p_pos];

        

        for (int i = low + 1; i <= high; i++) {

 

            if (array[i] < pivot) {            

               

                p_pos++;

 

                swap(array, p_pos, i); 

 

            }

 

        }

 

        swap(array, low, p_pos);

 

        return p_pos;

 

    }

    /**

     * 快速排序实现

     * @param array

     * @param low

     * @param high

     */

    public static void quickSort(int array[], int low, int high) {

 

        if (low < high) {

 

            int pivot = partition(array, low, high);

 

            quickSort(array, low, pivot - 1);

 

            quickSort(array, pivot + 1, high);

 

        }

 

    }

分享到:
评论

相关推荐

    java 快速排序 折半查找的界面实现 (递归与分治法)

    总的来说,快速排序和折半查找是计算机科学中不可或缺的算法,通过递归和分治策略,可以在Java中高效地实现这些算法,并结合界面设计,为用户提供直观的交互体验。在实际项目中,理解和掌握这些算法有助于优化数据...

    用java实现快速排序

    根据给定文件的信息,本文将围绕“用Java实现快速排序”的主题进行展开,不仅解析标题与描述中的核心知识点,还会对部分代码示例进行解读,最后结合这些信息给出一个完整的快速排序算法实现。 ### 快速排序算法简介...

    快速排序实现原理,及Java实现

    ### 快速排序实现原理及Java实现 #### 一、快速排序算法原理 快速排序是一种高效的排序算法,基于分治法的思想。它的工作原理可以概括为以下几个步骤: 1. **选择基准值**:从待排序的序列中选择一个元素作为基准...

    快排序的Java实现

    快速排序是一种高效的排序算法,由英国计算机科学家C.A.R....通过这个Java实现,你可以理解快速排序的基本工作原理,以及如何在实际编程中运用这种高效的排序算法。下载并运行提供的源代码,你可以看到快速排序的效果。

    java实现快速排序演示

    在这个Java实现的快速排序演示中,我们可以深入理解该算法的工作原理。 快速排序的主要步骤如下: 1. **选择枢轴元素**:首先,我们需要从待排序的数组中选取一个元素作为枢轴。这个元素将用来划分数组,使得其...

    用JAVA语言实现的对数据的快速排序法

    根据给定文件中的标题、描述、标签...综上所述,通过对给定文件的分析,我们不仅理解了如何使用Java实现快速排序算法,还深入了解了该算法的工作原理、性能特点以及优化方法,这对于理解和掌握快速排序具有重要意义。

    快速排序java实现

    在这个Java实现中,我们将详细探讨快速排序的工作原理,代码结构,以及如何通过源码理解和运用这个工具。 快速排序的步骤如下: 1. **选择基准元素(Pivot Selection)**:首先,从数组中选择一个元素作为“基准”...

    快速排序、归并排序、希尔排序、冒泡排序、选择排序等8中排序方式原理分析java实现

    在Java实现这些排序算法时,我们需要理解每种排序方法的基本逻辑,并将其转化为相应的代码结构。例如,快速排序的实现通常包括`partition`函数来划分数组,以及递归调用自身来处理子数组。归并排序则需要额外的存储...

    八种排序算法原理及Java实现( 冒泡排序+快速排序直接插入排序+希尔排序+选择排序+归并排序+基数排序)

    八种排序算法原理及Java实现是排序算法中的一种,包括冒泡排序、快速排序、直接插入排序、希尔排序、选择排序、归并排序和基数排序等。 冒泡排序是八种排序算法中的一种,属于交换排序。冒泡排序的基本思想是重复...

    Java实现快速排序.rar

    快速排序是一种高效的排序算法,由英国计算机科学家C.A.R....这个Java实现的快速排序压缩包可以帮助你理解并学习如何在实际编程中应用快速排序算法。通过阅读和运行代码,你可以更深入地理解快速排序的逻辑和实现细节。

    常用排序算法的java实现(冒泡、插入、选择、希尔、归并、快排)

    Java实现中,一般用“分区”操作来选取基准,然后递归地对左右子序列进行快速排序。 这些排序算法各有优缺点,如冒泡排序和插入排序简单但效率较低,适用于小规模数据;选择排序和希尔排序在特定情况下有较好的性能...

    快速排序的原理及java代码实现

    快速排序是一种高效的排序算法,由英国计算机科学家东尼·霍尔于1960年提出。它的主要思想是采用分治策略,通过一趟...Java实现快速排序时,可以通过创建辅助方法和递归调用来实现这个算法,从而对数组进行高效排序。

    java快速排序工具类

    使用泛型的对象排序工具类(使用算法:快速排序),适合初学者学习快速排序的基本原理和实现。

    各种排序代码的JAVA实现

    3. **快速排序**:快速排序是另一种高效的排序算法,采用“分而治之”的策略,选取一个基准值,将数组分为两部分,一部分所有元素都小于基准,另一部分所有元素都大于基准,然后对这两部分递归进行快速排序。JAVA...

    Java实现的快速排序和随机快排

    在这个Java实现中,我们将会探讨快速排序以及其变种——随机化快速排序。 1. **快速排序的基本原理** 快速排序的核心是选择一个“基准”元素,将数组分为两部分:小于基准的元素和大于或等于基准的元素。然后对这...

    内部排序算法java实现

    这里我们将深入探讨Java实现的几种内部排序算法,包括希尔排序、快速排序、堆排序、归并排序、冒泡排序、插入排序和选择排序。 首先,希尔排序是一种基于插入排序的算法,通过将原始数组分解成多个子序列来提高效率...

    七大排序算法的java实现

    Java实现如下: ```java void insertionSort(int[] arr) { for (int i = 1; i ; i++) { int key = arr[i]; int j = i - 1; while (j &gt;= 0 && arr[j] &gt; key) { arr[j + 1] = arr[j]; j = j - 1; } arr[j + 1...

    交换排序Java实现

    在编程领域,排序是至关重要的一个部分,尤其是在处理大量数据时。Java作为一种广泛使用的编程语言,提供了多种...在提供的压缩包文件"Demo_4"中,应该包含了具体的Java实现代码,你可以参考并学习这些示例来加深理解。

    JAVA 8种排序介绍及实现

    除了这两种排序算法,还有其他多种排序算法,如冒泡排序、快速排序、归并排序等,它们各有特点,适用于不同的场景。学习和掌握这些排序算法能帮助我们更好地理解和解决实际问题。在实际开发中,我们通常会根据数据...

    快速排序与冒泡排序,Java实现

    冒泡排序的Java实现相对简单,可以创建一个`bubbleSort()`方法来完成: ```java public static void bubbleSort(int[] arr) { int n = arr.length; for (int i = 0; i ; i++) { for (int j = 0; j ; j++) { if ...

Global site tag (gtag.js) - Google Analytics