排序算法(5)—快速排序
2013-09-22 16:56
288 查看
快速排序(Quick Sort)是冒泡排序的一种改进算法
基本思想:在当前的排序序列(K1,K2......Kn)中任意选取一个元素,把该元素称为基准元素或支点,把小于等于基准元素的所有元素都移动到基准元素的前面,把大于基准元素的所有元素都移动到基准元素的后面,这样使得基准元素的位置正好处于排序后的最终位置,并且把当前参加排序的序列分为前后两个子序列,接下来分别对这两个子序列重复上述操作,直至子序列长度为1。
举例分析:设有一个数据元素序列{3,6,4,2,11,10,5},要求按从小到大顺序排列,排序步骤如下图所示:
快速排序元素间的比较次数较少,速度较快;在各种内部排序方法中,快速排序被认为是目前最好的一种排序方法,代码如下所示(C#实现):
算法分析:快速排序属于不稳定排序,时间复杂度为:O(N*logN)(感谢博友 LoveJenny、饕盡天下、Oscarzhao的指正),空间复杂度:O(1)
基本思想:在当前的排序序列(K1,K2......Kn)中任意选取一个元素,把该元素称为基准元素或支点,把小于等于基准元素的所有元素都移动到基准元素的前面,把大于基准元素的所有元素都移动到基准元素的后面,这样使得基准元素的位置正好处于排序后的最终位置,并且把当前参加排序的序列分为前后两个子序列,接下来分别对这两个子序列重复上述操作,直至子序列长度为1。
举例分析:设有一个数据元素序列{3,6,4,2,11,10,5},要求按从小到大顺序排列,排序步骤如下图所示:
快速排序元素间的比较次数较少,速度较快;在各种内部排序方法中,快速排序被认为是目前最好的一种排序方法,代码如下所示(C#实现):
/// <summary> /// 快速排序 /// </summary> /// <param name="m_SourceArray">排序数组</param> /// <param name="m_Start">排序起始位置</param> /// <param name="m_End">排序结束位置</param> /// <returns></returns> public static int[] SortByQuickSort(int[] m_SourceArray,int m_Start,int m_End) { //序列长度大于1才需要进行排序 if (m_Start < m_End) { int i = m_Start; int j = m_End; //执行i++操作 while (m_SourceArray[m_Start] >= m_SourceArray[i] && i != m_End) i++; //执行j--操作 while (m_SourceArray[j] > m_SourceArray[m_Start] && j != 0) j--; if (i < j) { Swap(ref m_SourceArray[i], ref m_SourceArray[j]); SortByQuickSort(m_SourceArray, m_Start, m_End); } else { //交换后完成一次划分 Swap(ref m_SourceArray[m_Start], ref m_SourceArray[j]); //对划分左半部分进行排序 SortByQuickSort(m_SourceArray, m_Start, j - 1); //对划分右半部分进行排序 SortByQuickSort(m_SourceArray, j+1, m_End); } } return m_SourceArray; } /// <summary> /// 交换两个数 /// </summary> /// <param name="m_Num1"></param> /// <param name="m_Num2"></param> public static void Swap(ref int m_Num1, ref int m_Num2) { int tmp; tmp = m_Num1; m_Num1 = m_Num2; m_Num2 = tmp; }
算法分析:快速排序属于不稳定排序,时间复杂度为:O(N*logN)(感谢博友 LoveJenny、饕盡天下、Oscarzhao的指正),空间复杂度:O(1)
相关文章推荐
- 排序算法大集锦_交换类――快速排序
- 用JavaScript实现十大经典排序算法--快速排序
- 排序算法之--快速排序
- 排序算法——快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序的多种版本
- 易混的排序算法:冒泡排序、选择排序、快速排序
- 排序算法:快速排序(快排)
- 排序算法--快速排序
- 排序算法复习(Java实现)(一): 插入,冒泡,选择,Shell,快速排序
- JAVA中排序算法(冒泡排序、选择排序、插入排序、快速排序)
- 排序算法系列二之快速排序
- Java排序算法总结之(二)——基于交换排序(冒泡排序、快速排序)
- 排序算法系列——快速排序
- 排序算法---快速排序
- 排序算法系列之快速排序 (5)
- 排序算法4——快速排序
- 排序算法-快速排序
- 排序算法之六 快速排序