以数列 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
分享到:
相关推荐
本节将深入探讨两种常见的排序算法:冒泡排序和快速排序。 首先,我们来详细讲解冒泡排序。冒泡排序是一种简单直观的排序算法,它的基本思想是通过重复遍历待排序的数列,依次比较相邻元素并交换位置,使得较大的...
快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它基于分治法的策略,通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此...
在本文中,我们将深入探讨四种常见的内部排序方法:插入排序、快速排序、选择排序以及再次提到的选择排序。这四种排序方法在不同的场景下各有优劣,理解它们的工作原理和性能特性对于优化算法至关重要。 **1. 插入...
优化的关键在于,当待排序区间的元素数量减少到一定阈值时,不再使用快速排序,而是转而使用插入排序。这是因为对于小规模的数据,插入排序的效率往往更高。这个阈值K的选择是实验的重点,作者通过不断尝试不同大小...
快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它基于分治策略,通过选取一个基准值,将数组分为两部分,一部分的所有元素都小于基准值,另一部分的所有元素都大于或等于基准值,然后...
快速排序是一种高效的排序算法,其基本原理是通过划分将待排序的数据分为两个独立的部分,其中一个部分的所有数据都比另一部分的所有数据小,然后再对这两部分数据分别进行快速排序,这样的递归过程最终使得整个数据...
排序算法汇总(选择排序、直接插入排序、冒泡排序、希尔排序、快速排序、堆排序) 本资源介绍了六种常用的排序算法:选择排序、直接插入排序、冒泡排序、希尔排序、快速排序和堆排序。下面对每种算法进行详细介绍:...
快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是分治策略,通过选取一个“基准”元素,将数组分为两个子数组,使得左边的元素都小于基准,右边的元素都大于基准,然后对...
JavaScript快速排序是一种高效的排序算法,基于分治策略。在快速排序中,我们首先选择一个基准值(pivot),然后重新组织数组,使得基准值左边的所有元素都比它小,右边的所有元素都比它大。这个过程叫做分区操作。...
快速排序是一种高效的排序算法,基于分治策略。其主要步骤包括分解、解决和合并。在分解阶段,待排序序列L[m..n]被分为两部分,左边的元素都小于或等于主元pivot,右边的元素都大于pivot。解决阶段通过递归调用快速...
快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是分治法(Divide and Conquer),通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的...
在这个“快速排序工具”中,AutoIt 被用来实现对文件内容的高效排序。 快速排序是一种高效的排序算法,由C.A.R. Hoare在1960年提出。它的基本思想是采用分治法(Divide and Conquer):选取一个基准元素,将数组...
快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它基于分治策略,通过选取一个基准值(pivot)将数组分为两部分,一部分的所有元素都小于基准,另一部分的所有元素都大于或等于基准。...
根据提供的文件信息,本文将详细解析C语言中的快速排序算法,并深入探讨其实现原理与应用场景。 ### 快速排序算法概述 快速排序是一种高效的排序算法,由英国计算机科学家托尼·霍尔(Tony Hoare)在1960年提出。...
### 快速排序算法C语言实现与优化 #### 一、快速排序算法的基本原理 快速排序算法是一种基于分治策略的高效排序算法。其基本思想是通过一趟排序将待排序的记录分隔成独立的两部分,其中一部分的所有记录比另一部分...
快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它基于分治法(Divide and Conquer)策略,通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小...
在本文中,我们将深入探讨两种重要的算法:快速排序和大数阶乘相乘,并了解它们在汇编语言中的实现。这两个算法在计算机科学领域都占有举足轻重的地位,尤其在处理大规模数据时,其效率和性能至关重要。 首先,我们...
快速排序、归并排序、堆排序的数组和单链表实现 快速排序是一种常用的排序算法,它的时间复杂度为O(nlogn),是目前最快的排序算法之一。快速排序的基本思想是选择一个基准元素,然后将数组分成两个部分,一部分的...
根据提供的文件信息,我们可以分析出该Java程序主要实现了快速排序算法。下面将对该代码的关键部分进行解析,并从中提炼出相关的IT知识点。 ### 1. 文件输入处理 在`public static int input(int[] num)`方法中,...
### 二维数组与快速排序:基于结构体的实现 #### 一、背景介绍 在计算机科学中,排序算法是数据处理中的基础操作之一。对于一维数组,排序算法(如冒泡排序、插入排序、快速排序等)已经非常成熟且应用广泛。然而,...