使用快速排序法对一列数字进行排序的过程

快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。

步骤为:

  1. 从数列中挑出一个元素,称为 "基准"(pivot),
  2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆放在基准的后面(相同的数可以到任一边)。在这个分割结束之后,该基准就处于数列的中间位置。这个称为分割(partition)操作。
  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个演算法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

C#算法实现

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace 快速排序 //***对相同元素, 不稳定的排序算法***
{
//相对来说,快速排序数值越大速度越快 。 快速排序是所有排序里面最快的 class Program
{
static void Main(string[] args)
{
int[] arr = { , , , , , , , , , , , , }; //待排序数组
QuickSort(arr, , arr.Length - ); //调用快速排序函数。传值(要排序数组,基准值位置,数组长度) //控制台遍历输出
Console.WriteLine("排序后的数列:");
foreach (int item in arr)
Console.WriteLine(item);
} private static void QuickSort(int[] arr, int begin, int end)
{
if (begin >= end) return; //两个指针重合就返回,结束调用
int pivotIndex = QuickSort_Once(arr, begin, end); //会得到一个基准值下标 QuickSort(arr, begin, pivotIndex - ); //对基准的左端进行排序 递归
QuickSort(arr, pivotIndex + , end); //对基准的右端进行排序 递归
} private static int QuickSort_Once(int[] arr, int begin, int end)
{
int pivot = arr[begin]; //将首元素作为基准
int i = begin;
int j = end;
while (i < j)
{
//从右到左,寻找第一个小于基准pivot的元素
while (arr[j] >= pivot && i < j) j--; //指针向前移
arr[i] = arr[j]; //执行到此,j已指向从右端起第一个小于基准pivot的元素,执行替换 //从左到右,寻找首个大于基准pivot的元素
while (arr[i] <= pivot && i < j) i++; //指针向后移
arr[j] = arr[i]; //执行到此,i已指向从左端起首个大于基准pivot的元素,执行替换
} //退出while循环,执行至此,必定是 i= j的情况(最后两个指针会碰头)
//i(或j)所指向的既是基准位置,定位该趟的基准并将该基准位置返回
arr[i] = pivot;
return i;
} }
}

C#快速排序详解的更多相关文章

  1. 快速排序详解(C语言/python)

    快速排序详解 介绍: 快速排序于C. A. R. Hoare在1960年提出,是针对冒泡排序的一种改进.它每一次将需要排序的部分划分为俩个独立的部分,其中一个部分的数比的数都小.然后再按照这个方法对这 ...

  2. 快速排序详解以及java实现

    快速排序作为一种高效的排序算法被广泛应用,SUN的JDK中的Arrays.sort 方法用的就是快排. 快排采用了经典的分治思想(divide and conquer): Divide:选取一个基元X ...

  3. java快速排序详解

    快速排序 public class QuickSort { public static void main(String[] args) { int[] a = { 0, 3, 6, 8, 2, 4, ...

  4. JavaScript 快速排序详解

    使用的是<JavaScript数据结构与算法>一书中的快速排序,并加上自己的理解. 经测试,此算法的速度比内置的 sort 更快!而阮一峰的那个快排更像是归并排序,虽然写法简单很多,但是性 ...

  5. 快速排序详解(lomuto划分快排,hoare划分快排,classic经典快排,dualpivot双轴快排源码)

    目录 快速排序(lomuto划分快排,hoare划分快排,classic经典快排,dualpivot双轴快排) 一.快速排序思想 二.划分思想 三.测试用例 快速排序(lomuto划分快排,hoare ...

  6. Python实现的数据结构与算法之快速排序详解

    一.概述 快速排序(quick sort)是一种分治排序算法.该算法首先 选取 一个划分元素(partition element,有时又称为pivot):接着重排列表将其 划分 为三个部分:left( ...

  7. 18.Llinux-触摸屏驱动(详解)

    本节的触摸屏驱动也是使用之前的输入子系统 1.先来回忆之前第12节分析的输入子系统 其中输入子系统层次如下图所示, 其中事件处理层的函数都是通过input_register_handler()函数注册 ...

  8. 18.Llinux-触摸屏驱动(详解)【转】

    转自:https://www.cnblogs.com/lifexy/p/7628889.html 本节的触摸屏驱动也是使用之前的输入子系统 1.先来回忆之前第12节分析的输入子系统 其中输入子系统层次 ...

  9. JS-排序详解:冒泡排序、选择排序和快速排序

    JS-排序详解-冒泡排序 说明 时间复杂度指的是一个算法执行所耗费的时间 空间复杂度指运行完一个程序所需内存的大小 稳定指,如果a=b,a在b的前面,排序后a仍然在b的前面 不稳定指,如果a=b,a在 ...

随机推荐

  1. PROPAGATION_REQUIRED事务管理

    转载:http://blog.csdn.net/l345480242/article/details/7588393 采用编程式事务 1. getCurrentSession()与openSessio ...

  2. netty是什么?

    Netty是什么? 相对于Tomcat这种Web Server(顾名思义主要是提供Web协议相关的服务的),Netty是一个Network Server,是处于Web Server更下层的网络框架,也 ...

  3. ExecutorService中submit和execute的区别

    在Java5之后,并发线程这块发生了根本的变化,最重要的莫过于新的启动.调度.管理线程的一大堆API了.在Java5以后,通过Executor来启动线程比用Thread的start()更好.在新特征中 ...

  4. SendMessage、PostMessage原理

    SendMessage.PostMessage原理 本文讲解SendMessage.PostMessage两个函数的实现原理,分为三个步骤进行讲解,分别适合初级.中级.高级程序员进行理解,三个步骤分别 ...

  5. js 字符串日期 转成 Date

    只支持 2015/09/23 反斜杠这样类型 2015-09-23 单横的这种无法识别 var dateStr='${endDate}'; dateStr=dateStr.replace(/-/g,' ...

  6. 在Tomcat中配置数据源

    使用工具:TOMCAT 7.0.52.IntelliJ IDEA 13.0.2.JSF 2.0+.SqlServer.jtds-1.2.5.jar 搞了好久都没成功,开始使用注解引入DataSourc ...

  7. 关于Javascript函数的几点笔记

    函数本质上是一个有名字的程序块,程序块使得多条语句可以一起执行. 变量类型: 1.复杂类型:Object.Array等. 2.原始类型:String.Integer等. 函数参数: 1.复杂类型:传递 ...

  8. HTML常用标签及其全称

    <a href="#">a 超级链接(anchor)</a>     <abbr title="abbreviation的简写"& ...

  9. PHP5.4连接sqlserver

    1.下载微软的php连接驱动:SQLSRV30.EXE(5.4对应,后面的native client要用2012)/SQLSRV20.EXE(5.3对应,native client要用2008)/SQ ...

  10. Android开发之ActivityManager获取系统信息

    1.判断指定的service是否在运行 public static boolean isServiceRunning(Context ctx, String serviceName) { Activi ...