C# 排序算法之快速排序

23 篇文章 0 订阅

快速排序(Quick Sort)是一种高效的排序算法,由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将待排记录分隔成独立的两部分,其中一部分的所有记录均比另一部分的所有记录小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。这个过程可以递归进行,以达到整个序列变为有序序列。

以下是快速排序算法的C#实现:

using System;

class Program
{
    static void Main(string[] args)
    {
        int[] arr = { 10, 7, 8, 9, 1, 5 };
        QuickSort(arr, 0, arr.Length - 1);
        Console.WriteLine("Sorted array: ");
        PrintArray(arr);
    }

    // 快速排序算法
    static void QuickSort(int[] arr, int low, int high)
    {
        if (low < high)
        {
            // 划分操作,返回划分后基准值的索引
            int pi = Partition(arr, low, high);

            // 递归地对基准值左边的子数组进行快速排序
            QuickSort(arr, low, pi - 1);

            // 递归地对基准值右边的子数组进行快速排序
            QuickSort(arr, pi + 1, high);
        }
    }

    // 划分操作
    static int Partition(int[] arr, int low, int high)
    {
        // 选择最右边的元素作为基准值
        int pivot = arr[high];
        int i = (low - 1); // 较小元素的索引

        for (int j = low; j < high; j++)
        {
            // 如果当前元素小于或等于基准值
            if (arr[j] <= pivot)
            {
                i++;    // 移动较小元素的索引

                // 交换arr[i]和arr[j]
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }

        // 将基准值交换到其最终位置
        int temp = arr[i + 1];
        arr[i + 1] = arr[high];
        arr[high] = temp;

        // 返回基准值的索引
        return i + 1;
    }

    // 打印数组的方法
    static void PrintArray(int[] arr)
    {
        foreach (int i in arr)
        {
            Console.Write(i + " ");
        }
        Console.WriteLine();
    }
}

在这个实现中,QuickSort 方法是快速排序的递归实现。它接受一个数组和两个整数作为参数,分别表示要排序的数组段落的起始和结束索引。如果起始索引小于结束索引,说明数组段落中有多个元素,需要进行排序。方法首先调用 Partition 方法来选择一个基准值,并重新排列数组,使得所有小于基准值的元素都移到基准值的左边,所有大于基准值的元素都移到基准值的右边。然后,递归地对基准值左右两边的子数组进行相同的操作。

Partition 方法实现了划分操作,它选择一个基准值(这里选择的是子数组的最后一个元素),并通过遍历子数组,将所有小于或等于基准值的元素移动到基准值的左边,所有大于基准值的元素移动到基准值的右边。最后,将基准值交换到它的最终位置,即小于它的所有元素的右边,大于它的所有元素的左边,并返回这个位置的索引。

PrintArray 方法与之前一样,用于打印排序后的数组。

快速排序的平均时间复杂度为O(n log n),但在最坏情况下(如数组已经是有序的)时间复杂度会退化到O(n^2)。不过,通过随机选择基准值或使用其他策略(如三数取中法),可以大大降低最坏情况发生的概率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AitTech

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值