`

快速排序(转)

 
阅读更多

 以数列 14,11,25,37,9,28 为例,详细描述执行一趟快速排序的算法:

   1,选择待排序数列的枢轴,一般以数列的首元素作为枢轴.此数列中,我们选择首元素14作为枢轴,nPivot = 14.

  2,设定两个指针 i 和 j ,分别指向数列的首元素和尾元素. i 指向首元素14, j 指向尾元素28.示意图如下:

  3,向前移动尾指针 j ,使其指向从数列尾部算起首个小于枢轴(即14)的元素,并将该元素置换到头指针 i 指向的位置._nArray[i] =_nArray[j].示意图如下:

  首次执行该操作时 i 指针指向处的值实际上就是枢轴的值,此处的操作可以理解为 i 指针指向处的值已在之前被置换到枢轴中,此时, i 指向处已经是一个空位,在此时用找到的小于枢轴的元素填在此处.

  4,向后移动头指针 i ,使其指向从数列头部算起首个大于枢轴(即14)的元素,并将该元素置换到尾指针 j 指向的位置._nArray[j] =_nArray[i].示意图如下:

  此处同样可以理解为 j 指针指向处的值已在上一步操作中置换了出去. j 处已是一个空位.

  5,如此重复执行步骤3和步骤4,直至 i==j 时结束该循环.

  6,退出了该循环后, i 与 j 必定指向同一位置.在该位置的前部元素,其值均小于枢轴.而在该位置的后部元素,其值均大于枢轴.显而易见,此时 i 和 j 同时指向的位置就应该是枢轴的"新家"._nArray[i]=nPivot.如下图:

  至此,一趟排序结束.待排序数列的首元素将该数列分成了比其小和比其大的两部分.如下图:

  接着,我们对这一大一小两部分子数列执行相同的排序操作.

  如此"递归",直至对整个数列完成排序操作.

   以下是c#实现代码:

 1using System;
 2
 3public class Sort
 4{
 5    public class Quick_Sort
 6    {
 7        private static int QuickSort_Once(int[] _pnArray, int _pnLow, int _pnHigh)
 8        {
 9            int nPivot = _pnArray[_pnLow];      //将首元素作为枢轴
10            int i = _pnLow, j = _pnHigh;
11
12            while (i < j)
13            { 
14                //从右到左,寻找首个小于nPivot的元素
15                while (_pnArray[j] >= nPivot && i<j) j--;
16                //执行到此,j已指向从右端起首个小于nPivot的元素
17                //执行替换
18                _pnArray[i] = _pnArray[j];
19                //从左到右,寻找首个大于nPivot的元素
20                while (_pnArray[i] <= nPivot && i<j) i++;
21                //执行到此,i已指向从左端起首个大于nPivot的元素
22                //执行替换
23                _pnArray[j] = _pnArray[i];
24            }
25
26            //推出while循环,执行至此,必定是i=j的情况
27            //i(或j)指向的即是枢轴的位置,定位该趟排序的枢轴并将该位置返回
28            _pnArray[i] = nPivot;
29            return i;
30        }
31
32        private static void QuickSort(int[] _pnArray, int _pnLow, int _pnHigh)
33        {
34            if (_pnLow >= _pnHigh) return;
35
36            int _nPivotIndex = QuickSort_Once(_pnArray, _pnLow, _pnHigh);
37            //对枢轴的左端进行排序
38            QuickSort(_pnArray, _pnLow, _nPivotIndex-1);
39            //对枢轴的右端进行排序
40            QuickSort(_pnArray, _nPivotIndex + 1,_pnHigh);
41        }
42
43        public static void Main()
44        {
45            Console.WriteLine("请输入待排序数列(以","分割):");
46            string _s = Console.ReadLine();
47            string[] _sArray = _s.Split(",".ToCharArray());
48            int _nLength = _sArray.Length;
49            int[] _nArray = new int[_nLength];
50            for (int i = 0; i < _nLength; i++)
51            {
52                _nArray[i] = Convert.ToInt32(_sArray[i]);
53            }
54            QuickSort(_nArray, 0, _nLength-1);
55            Console.WriteLine("排序后的数列为:");
56            foreach (int _n in _nArray)
57            {
58                Console.WriteLine(_n.ToString());
59            }
60        }
61    }
62}
63

分享到:
评论

相关推荐

    JAVA冒泡排序和快速排序算法

    本节将深入探讨两种常见的排序算法:冒泡排序和快速排序。 首先,我们来详细讲解冒泡排序。冒泡排序是一种简单直观的排序算法,它的基本思想是通过重复遍历待排序的数列,依次比较相邻元素并交换位置,使得较大的...

    易语言快速排序

    快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它基于分治法的策略,通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此...

    数据结构 插入排序、快速排序、选择排序、选择排序

    在本文中,我们将深入探讨四种常见的内部排序方法:插入排序、快速排序、选择排序以及再次提到的选择排序。这四种排序方法在不同的场景下各有优劣,理解它们的工作原理和性能特性对于优化算法至关重要。 **1. 插入...

    快速排序算法

    优化的关键在于,当待排序区间的元素数量减少到一定阈值时,不再使用快速排序,而是转而使用插入排序。这是因为对于小规模的数据,插入排序的效率往往更高。这个阈值K的选择是实验的重点,作者通过不断尝试不同大小...

    java Document 快速排序法

    快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它基于分治策略,通过选取一个基准值,将数组分为两部分,一部分的所有元素都小于基准值,另一部分的所有元素都大于或等于基准值,然后...

    快速排序的原理

    快速排序是一种高效的排序算法,其基本原理是通过划分将待排序的数据分为两个独立的部分,其中一个部分的所有数据都比另一部分的所有数据小,然后再对这两部分数据分别进行快速排序,这样的递归过程最终使得整个数据...

    排序算法汇总(选择排序 ,直接插入排序,冒泡排序,希尔排序,快速排序,堆排序)

    排序算法汇总(选择排序、直接插入排序、冒泡排序、希尔排序、快速排序、堆排序) 本资源介绍了六种常用的排序算法:选择排序、直接插入排序、冒泡排序、希尔排序、快速排序和堆排序。下面对每种算法进行详细介绍:...

    C语言编写的泛型快速排序算法

    快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是分治策略,通过选取一个“基准”元素,将数组分为两个子数组,使得左边的元素都小于基准,右边的元素都大于基准,然后对...

    JavaScript快速排序1

    JavaScript快速排序是一种高效的排序算法,基于分治策略。在快速排序中,我们首先选择一个基准值(pivot),然后重新组织数组,使得基准值左边的所有元素都比它小,右边的所有元素都比它大。这个过程叫做分区操作。...

    快速排序(C语言).pdf

    快速排序是一种高效的排序算法,基于分治策略。其主要步骤包括分解、解决和合并。在分解阶段,待排序序列L[m..n]被分为两部分,左边的元素都小于或等于主元pivot,右边的元素都大于pivot。解决阶段通过递归调用快速...

    快速排序算法代码,值得参考

    快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是分治法(Divide and Conquer),通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的...

    autoit 快速排序工具

    在这个“快速排序工具”中,AutoIt 被用来实现对文件内容的高效排序。 快速排序是一种高效的排序算法,由C.A.R. Hoare在1960年提出。它的基本思想是采用分治法(Divide and Conquer):选取一个基准元素,将数组...

    32数据结构-快速排序.rar

    快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它基于分治策略,通过选取一个基准值(pivot)将数组分为两部分,一部分的所有元素都小于基准,另一部分的所有元素都大于或等于基准。...

    c语言的快速排序算法

    根据提供的文件信息,本文将详细解析C语言中的快速排序算法,并深入探讨其实现原理与应用场景。 ### 快速排序算法概述 快速排序是一种高效的排序算法,由英国计算机科学家托尼·霍尔(Tony Hoare)在1960年提出。...

    快速排序算法C语言实现与优化.pdf

    ### 快速排序算法C语言实现与优化 #### 一、快速排序算法的基本原理 快速排序算法是一种基于分治策略的高效排序算法。其基本思想是通过一趟排序将待排序的记录分隔成独立的两部分,其中一部分的所有记录比另一部分...

    C++快速排序

    快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它基于分治法(Divide and Conquer)策略,通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小...

    大数阶乘相乘和快速排序汇编实现

    在本文中,我们将深入探讨两种重要的算法:快速排序和大数阶乘相乘,并了解它们在汇编语言中的实现。这两个算法在计算机科学领域都占有举足轻重的地位,尤其在处理大规模数据时,其效率和性能至关重要。 首先,我们...

    [算法]快速排序,归并排序,堆排序的数组和单链表实现 数组和链表.pdf

    快速排序、归并排序、堆排序的数组和单链表实现 快速排序是一种常用的排序算法,它的时间复杂度为O(nlogn),是目前最快的排序算法之一。快速排序的基本思想是选择一个基准元素,然后将数组分成两个部分,一部分的...

    Java快速排序源代码

    根据提供的文件信息,我们可以分析出该Java程序主要实现了快速排序算法。下面将对该代码的关键部分进行解析,并从中提炼出相关的IT知识点。 ### 1. 文件输入处理 在`public static int input(int[] num)`方法中,...

    二维的qsort,根据其中任何一维进行快速排序

    ### 二维数组与快速排序:基于结构体的实现 #### 一、背景介绍 在计算机科学中,排序算法是数据处理中的基础操作之一。对于一维数组,排序算法(如冒泡排序、插入排序、快速排序等)已经非常成熟且应用广泛。然而,...

Global site tag (gtag.js) - Google Analytics