快速排序算法C#实现
最近想把几大经典的排序算法系统的整理过一遍,写下笔记,算是复习吧!!
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#代码实现:
1 static void Main(string[] args) 2 { 3 int[] array = new[] {6, 7, 2, 1, 9, 4, 3, 10, 5, 8}; 4 Sort(array, 0, array.Length - 1); 5 foreach (int item in array) 6 { 7 Console.Write(item + " "); 8 } 9 Console.ReadLine(); 10 }
/// <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 - 1);//递归调用,对右边部分的数组进行单元排序Sort(array, index + 1, 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;}
转载于:https://www.cnblogs.com/homeforhzw/p/6272439.html
快速排序算法C#实现相关推荐
- 算法图解/二分查找/简单查找/选择排序/递归算法/快速排序算法/
大 O 表示法 大 O 表示法在讨论运行时间时,log 指的都是 log2 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度. 大 O 表示法指出 ...
- 快速排序算法实现思想个人理解
一.概述 快速排序是冒泡排序的改进算法.它也是通过不断比较和移动交换来实现排序的,只不过它的实现增大了记录的比较和移动的距离,将关键字较大的元素从前面直接放到后面,关键字较小的元素直接从后面放到前面, ...
- 快速排序算法(基于Java实现)
title: 快速排序算法(基于Java实现) tags: 快速排序算法 快速排序算法的原理与代码实现: 一.快速排序算法的原理 快排算法的思想是: 如果需要排序数组中下标从p到r之间的一组数据,我们 ...
- java sort算法名称_快速排序算法(Quick Sort)(java)
/** * 快速排序算法是基于分治策略的一种排序算法,下面是一个递归的快速排序. * @author liuy */ public class QuickSort { public static vo ...
- 【算法】快速排序算法的编码和优化
参考资料 <算法(第4版)> - - Robert Sedgewick, Kevin Wayne <啊哈! 算法> - - 啊哈磊 ...
- Quick Sort 快速排序算法
Table of Contents 前言 算法步骤 选取枢纽元 分割数组 算法实现 小数组和插入排序 结语 前言 快速排序算法应该是常见的排序算法中使用的最多的一个,很多语言内置的排序算法都间接或直接 ...
- 排序算法系列:快速排序算法
概述 在前面说到了两个关于交换排序的算法:冒泡排序与奇偶排序. 本文就来说说交换排序的最后一拍:快速排序算法.之所以说它是快速的原因,不是因为它比其他的排序算法都要快.而是从实践中证明了快速排序在平均 ...
- 快速排序算法_基于位运算的快速排序算法
前言 如果你准备看这篇文章,我就当你是懂快速排序算法原理的. 下面是我在2018年10月3日想到的基于二进制位运算对正整数进行的一种快速排序算法,目前的代码只能对正整数进行有效的排序,当然,稍微修改一 ...
- 【图文解释】快速排序算法
高快省的排序算法 有没有既不浪费空间又可以快一点的排序算法呢?那就是"快速排序"啦!光听这个名字是不是就觉得很高端呢. 假设我们现在对"6 1 2 7 9 3 ...
最新文章
- caxa电子图板2018中文版
- matlab eeg信号处理,EEG数据信号的Matlab滤波仿真设计分析研究
- windows系统和linux系统可以使用相同的js代码吗_使用Sboxr自动发现和利用DOM(客户端)XSS漏洞...
- 【英语学习】【WOTD】cerebral 释义/词源/示例
- linux uucp 改为 root,ubuntu 10.04 /etc目录下找不到vsftpd.user_list和vsfepd.ftpusers两个文件?...
- 第三次小组实践作业小组每日进度汇报:2017-12-2
- 原创engine中地块的自动编号函数
- Qt-textEdit 滚顶条设置只读模式
- HTTP和HTTPS及 Fiddler抓包原理
- HTML5 网站大观:15个精美的 HTML5 作品集网站实例
- 邮件群发软件哪个好用?
- php有没有ispostback,php用什么表示IsPostBack?
- 萤石云谷歌禁用flash_mac chrome屏蔽flash插件怎么办 mac chrome flash启用方法
- 获取股票交易数据的Tushare的使用方法
- js如何取到ajax回调函数值,js怎样获取调用回调函数的参数值
- char、int、long它们各占几个字节?占几位?
- Android学习之ImageView放置gif动态图
- 黑洞大作战游戏架构设计与实现
- 为了搞清楚类加载,竟然手撸JVM!
- lua 自实现pairs