• C#快速排序算法


    快速排序实现原理

    快速排序(Quick Sort)是一种常用的排序算法,它基于分治的思想,通过将一个无序的序列分割成两个子序列,并递归地对子序列进行排序,最终完成整个序列的排序。

    其基本思路如下:

    1. 选择数组中的一个元素作为基准(pivot)。

    2. 将数组中小于等于基准的元素放在基准的左边,将大于基准的元素放在基准的右边。

    3. 对基准左右两边的子数组分别重复步骤1和步骤2,直到子数组的大小为1或0(递归结束)。

    具体实现步骤如下:

    1. 首先选择一个基准元素,通常为数组的第一个或最后一个元素。

    2. 设置两个指针,一个指向数组的起始位置(低位),一个指向数组的结束位置(高位)。

    3. 使用两个指针从两个方向同时遍历数组,直到两个指针相遇。

    4. 从低位开始,比较当前元素与基准元素的大小关系:

      • 如果当前元素小于等于基准元素,则向右移动低位指针。

      • 如果当前元素大于基准元素,则向左移动高位指针。

      • 如果低位指针仍然在高位指针的左侧,则交换低位指针和高位指针所指向的元素。

    5. 重复步骤4,直到低位指针与高位指针相遇。

    6. 将基准元素与相遇位置的元素进行交换,确保基准元素位于其最终的排序位置。

    7. 根据基准元素的位置,将数组分为两个子数组,并递归地对这两个子数组进行快速排序。

    快速排序图解

    图片

    递归的快速排序的代码示例

    1.     public class 快速排序算法
    2.     {
    3.         public static void Sort(int[] array, int low, int high)
    4.         {
    5.             if (low < high)
    6.             {
    7.                 //将数组分割为两部分,并返回分割点的索引
    8.                 int pivotIndex = Partition(array, low, high);
    9.                 //递归对分割后的两部分进行排序
    10.                 Sort(array, low, pivotIndex - 1);
    11.                 Sort(array, pivotIndex + 1, high);
    12.             }
    13.         }
    14.         private static int Partition(int[] array, int low, int high)
    15.         {
    16.             //选择最后一个元素作为基准元素
    17.             int pivot = array[high];
    18.             int i = low - 1;
    19.             for (int j = low; j <= high - 1; j++)
    20.             {
    21.                 //如果当前元素小于等于基准元素,则将它与i+1位置的元素交换
    22.                 if (array[j] <= pivot)
    23.                 {
    24.                     i++;
    25.                     Swap(array, i, j);
    26.                 }
    27.             }
    28.             //将基准元素放置到正确的位置上
    29.             Swap(array, i + 1, high);
    30.             return i + 1//返回基准元素的索引
    31.         }
    32.         private static void Swap(int[] array, int i, int j)
    33.         {
    34.             int temp = array[i];
    35.             array[i] = array[j];
    36.             array[j] = temp;
    37.         }
    38.         public static void QuickSortRun()
    39.         {
    40.             int[] array = { 23538191526273644474650484 };
    41.             Sort(array, 0, array.Length - 1);
    42.             Console.WriteLine("排序后结果:" + string.Join(", ", array));
    43.         }
    44.     }

    总结

    快速排序是一种高效的排序算法,它的优势在于平均时间复杂度为O(nlogn),在实际应用中通常表现出色。然而,最坏情况下的时间复杂度可能达到O(n^2),但通过合适的优化方法如随机选择基准元素、三数取中法等,可以避免最坏情况的发生,提高性能。递归方式简洁易懂但对于大数据量的排序可能会出现栈溢出的问题,而使用栈模拟递归则可以解决这个问题。

  • 相关阅读:
    实战系列(二)| MybatisPlus详细介绍,包含代码详解
    2014NOIP普及组真题 2. 比例简化
    JSON,对象深拷贝
    SpringMVC[从零开始]
    【树莓派不吃灰】命令篇⑨ 记录学习文件系统
    1、密码学
    python中的编码格式
    普洛斯数据中心发布DC Brain系统,科技赋能智慧化运营管理
    以业务为核心,泛微协助生产制造企业推动销售到生产一体化管理
    C++前缀和算法的应用:石头游戏 VIII 原理源码测试用例
  • 原文地址:https://blog.csdn.net/qq_37237487/article/details/133915975