快速排序(Quick Sort)是冒泡排序的一种改进算法
基本思想:在当前的排序序列(K1,K2......Kn)中任意选取一个元素,把该元素称为基准元素或支点,把小于等于基准元素的所有元素都移动到基准元素的前面,把大于基准元素的所有元素都移动到基准元素的后面,这样使得基准元素的位置正好处于排序后的最终位置,并且把当前参加排序的序列分为前后两个子序列,接下来分别对这两个子序列重复上述操作,直至子序列长度为1。
举例分析:设有一个数据元素序列{3,6,4,2,11,10,5},要求按从小到大顺序排列,排序步骤如下图所示:
快速排序元素间的比较次数较少,速度较快;在各种内部排序方法中,快速排序被认为是目前最好的一种排序方法,代码如下所示(C#实现):
1 /// <summary> 2 /// 快速排序 3 /// </summary> 4 /// <param name="m_SourceArray">排序数组</param> 5 /// <param name="m_Start">排序起始位置</param> 6 /// <param name="m_End">排序结束位置</param> 7 /// <returns></returns> 8 public static int[] SortByQuickSort(int[] m_SourceArray,int m_Start,int m_End) 9 { 10 //序列长度大于1才需要进行排序 11 if (m_Start < m_End) 12 { 13 int i = m_Start; 14 int j = m_End; 15 //执行i++操作 16 while (m_SourceArray[m_Start] >= m_SourceArray[i] && i != m_End) 17 i++; 18 //执行j--操作 19 while (m_SourceArray[j] > m_SourceArray[m_Start] && j != 0) 20 j--; 21 if (i < j) 22 { 23 Swap(ref m_SourceArray[i], ref m_SourceArray[j]); 24 SortByQuickSort(m_SourceArray, m_Start, m_End); 25 } 26 else 27 { 28 //交换后完成一次划分 29 Swap(ref m_SourceArray[m_Start], ref m_SourceArray[j]); 30 //对划分左半部分进行排序 31 SortByQuickSort(m_SourceArray, m_Start, j - 1); 32 //对划分右半部分进行排序 33 SortByQuickSort(m_SourceArray, j+1, m_End); 34 } 35 } 36 return m_SourceArray; 37 } 38 39 /// <summary> 40 /// 交换两个数 41 /// </summary> 42 /// <param name="m_Num1"></param> 43 /// <param name="m_Num2"></param> 44 public static void Swap(ref int m_Num1, ref int m_Num2) 45 { 46 int tmp; 47 tmp = m_Num1; 48 m_Num1 = m_Num2; 49 m_Num2 = tmp; 50 }
算法分析:快速排序属于不稳定排序,时间复杂度为:O(N*logN)(感谢博友 LoveJenny、饕盡天下、Oscarzhao的指正),空间复杂度:O(1)