最近想把几大经典的排序算法系统的整理过一遍,写下笔记,算是复习吧!!

1、快速排序。

  快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列——来自百度百科。

  假设我们要对数组Array 6  7  2  1  9  4  3  10  5  8排序,先在序列中找任意一个数(此例取第一个)作为基准数(就是一界限,大于此数放序列的右边小于或等于放左边)

下标

0

1

2

3

4

5

6

7

8

9

6

7

2

1

9

4

3

10

5

8

初始化:i=0,j=9,基准数 X=6

从j开始往前找一个小于或等于X的数,

当j=8时,Array [0] = Array[8](i++),数组变为:

下标

0

1

2

3

4

5

6

7

8

9

5

7

2

1

9

4

3

10

5

8

从i开始往后找一个比X大的数,

当i=1时,Array[8]= Array[1](j--),数组变为:

下标

0

1

2

3

4

5

6

7

8

9

5

7

2

1

9

4

3

10

7

8

从j开始往前找一个小于或等于X的数,

当j=6时,Array[1]= Array[6](i++),数组变为:

下标

0

1

2

3

4

5

6

7

8

9

5

3

2

1

9

4

3

10

7

8

从i开始往后找一个大于X的数,

当i=4时,Array[6]= Array[4] (j--),数组变为:

下标

0

1

2

3

4

5

6

7

8

9

5

3

2

1

9

4

9

10

7

8

从j开始往前找一个小于或等于X的数,

当j=5时,Array[4]= Array [5] (i++),数组变为:

下标

0

1

2

3

4

5

6

7

8

9

5

3

2

1

4

4

9

10

7

8

当i==j==5时,停止循环,将基准数填入,Array[5]=X,数组变为:

下标

0

1

2

3

4

5

6

7

8

9

5

3

2

1

4

6

9

10

7

8

此次循环结束后,可以看出,Array[5]左边的数据都比它小,右边的数都比它大,因此再对Array [0…4] 和Array [6…9]重复上述步骤即可(递归调用)。

C#代码实现:

  static void Main(string[] args)
{
int[] array = new[] {, , , , , , , , , };
Sort(array, , array.Length - );
foreach (int item in array)
{
Console.Write(item + " ");
}
Console.ReadLine();
}
      /// <summary>
/// 排序
/// </summary>
/// <param name="array">要排序的数组</param>
/// <param name="low">下标开始位置,向右查找</param>
/// <param name="high">下标开始位置,向左查找</param>
public static void Sort(int[] array, int low, int high)
{
if (low >= high)
return;
//完成一次单元排序
int index = SortUnit(array, low, high);
//递归调用,对左边部分的数组进行单元排序
Sort(array, low, index - );
//递归调用,对右边部分的数组进行单元排序
Sort(array, index + , high);
}      /// <summary>
/// 单元排序
/// </summary>
/// <param name="array">要排序的数组</param>
/// <param name="low">下标开始位置,向右查找</param>
/// <param name="high">下标开始位置,向右查找</param>
/// <returns>每次单元排序的停止下标</returns>
public static int SortUnit(int[] array, int low, int high)
{
int key = array[low];//基准数
while (low < high)
{
//从high往前找小于或等于key的值
while (low < high && array[high] > key)
high--;
//比key小开等的放左边
array[low] = array[high];
//从low往后找大于key的值
while (low < high && array[low] <= key)
low++;
//比key大的放右边
array[high] = array[low];
}
//结束循环时,此时low等于high,左边都小于或等于key,右边都大于key。将key放在游标当前位置。
array[low] = key;
return high;
}

快速排序算法C#实现的更多相关文章

  1. 快速排序算法 java 实现

    快速排序算法 java 实现 快速排序算法Java实现 白话经典算法系列之六 快速排序 快速搞定 各种排序算法的分析及java实现 算法概念 快速排序是C.R.A.Hoare于1962年提出的一种划分 ...

  2. C# 集合扩展快速排序算法

    /// <summary> /// 对集合进行排序,如 /// List<Person> users=new List<Person>(){.......} /// ...

  3. PHP描述冒泡排序和快速排序算法

    使用PHP描述冒泡排序和快速排序算法,对象可以是一个数组.使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组.写一个二维数组排序算法函数,能够具有通用 ...

  4. 快速排序算法(Java)

    快速排序算法的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另外一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序. class Parti ...

  5. 快速排序算法-C语言实现

    注:本篇内容为翻译,之所以选择这篇进行翻译原因是该文章含有动画,能够更加直观地展示快速排序.同时,可以仔细看一下代码,代码中把结构化的思想给予了更加充分地表现.按照功能进行模块划分的思想得到了彻底地贯 ...

  6. C#快速排序算法基础入门篇

    相信算法对于许多开发人员来说都是一大难点,之所以难,就像设计模式一样,许多人在阅读之后,没有很好地理解,也不愿意动手上机操作,只停留在理论的学习上面,随着时间推移就慢慢淡忘. 有些东西,你可以发明创造 ...

  7. 快速排序算法 Quick sort

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4046189.html 首先随机选择一个轴,并调整数组内各个数字,使得比轴值大的数在轴的右边, ...

  8. PHP实现快速排序算法

    快速排序(Quick Sort)是对冒泡排序的一种改进,属不稳定排序算法,由东尼·霍尔在1962年提出.快速排序基本步骤:从数列中挑出一个元素(一般称为称为“基准”),通过一趟排序将要排序的数据分割成 ...

  9. Java快速排序算法

    快速排序算法思想: 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一 ...

  10. 排序系列 之 快速排序算法 —— Java实现

    基本思想: 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变 ...

随机推荐

  1. PLSQL配置登录用户信息

    PLSQL配置登录用户信息 2012-08-30 08:47:02     我来说两句      作者:lsxy117 收藏    我要投稿 PLSQL配置登录用户信息   工作中经常使用PLSQL ...

  2. Android学习路径(四)文件项目学习的名单,android显示单元经常使用的

    1.的该项目文件所谓名单AndroidManifest.xml文件.该文件,但有很大的利用,例:app名字.图标,app支持的版本app等等.以下我就介绍下这个清单文件的各个參数的作用. <ma ...

  3. 经典的SQL语句面试题

    Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师表 问题 ...

  4. maven 启蒙

    Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具.为了替代ANT的Apache开源项目.现在的项目越来越大.ANT已经不适用了. 1.部署m ...

  5. Git工作流:中心工作流(翻译)

    使用Git作为版本控制器,有众多可能的工作流(Workflow),这使得我们这些新鸟不知道在实际工作中不知道该选择哪种工作流.这里我们对最常见的Git工作流做一个对比,为企业团队提供一个参考. 正如你 ...

  6. Android系统源码导入到eclipse

    1.把eclipse工程配置文件复制到android源码根目录下      cp development/ide/eclipse/.classpath ./  2. 在android源码根目录下新建文 ...

  7. 安装mono和jexus,运行asp.net程序

    随笔- 62  文章- 1  评论- 7  raspberrypi(树莓派)上安装mono和jexus,运行asp.net程序   参考网址: http://www.linuxdot.net/ htt ...

  8. [转]Mac OS X local privilege escalation (IOBluetoothFamily)

    Source: http://joystick.artificialstudios.org/2014/10/mac-os-x-local-privilege-escalation.html Nowad ...

  9. [原]逆向iOS SDK -- _UIImageAtPath 的实现(SDK 5.1)

    注释过的反汇编代码:http://pan.baidu.com/share/link?shareid=3491166579&uk=537224442 伪代码(不精确,仅供参考): NSStrin ...

  10. iOS国际化和genstrings所有子目录本地化字符串

    最近在忙着一个国外项目,天天加班,没时间更新博客.就简单讲讲国际化的知识. 首先,我们使用字符串,必须用NSLocalizedString(key,comment),这样我们在不同的Localizab ...