• 快速排序


    快速排序

    快速排序(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(N2), 空间复杂度:O(1) 

      

     
     
     
    标签: 排序算法
  • 相关阅读:
    JS 中 console 的用法
    C#可扩展编程之MEF学习笔记(二):MEF的导出(Export)和导入(Import)
    C#可扩展编程之MEF学习笔记(一):MEF简介及简单的Demo
    MEF框架使用总结
    webfunny前端监控开源项目
    我从Vue源码中学到的一些JS编程技巧
    nodejs 发送邮件demo
    从零开始手写Promise
    概率论要点
    行列式技巧
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3333992.html
Copyright © 2020-2023  润新知