117.info
人生若只如初见

c#快速排序的递归与非递归形式

递归形式的C#快速排序算法:

using System;

class QuickSort
{
    public static void Sort(int[] arr, int low, int high)
    {
        if (low < high)
        {
            int pivot = Partition(arr, low, high);
            Sort(arr, low, pivot - 1);
            Sort(arr, pivot + 1, high);
        }
    }

    public 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++;
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }

        int temp1 = arr[i + 1];
        arr[i + 1] = arr[high];
        arr[high] = temp1;

        return i + 1;
    }

    public static void PrintArray(int[] arr)
    {
        foreach (int num in arr)
        {
            Console.Write(num + " ");
        }
        Console.WriteLine();
    }

    public static void Main()
    {
        int[] arr = { 12, 11, 13, 5, 6, 7 };
        int n = arr.Length;

        Console.WriteLine("Original array:");
        PrintArray(arr);

        Sort(arr, 0, n - 1);

        Console.WriteLine("Sorted array:");
        PrintArray(arr);
    }
}

非递归形式的C#快速排序算法:

using System;
using System.Collections.Generic;

class QuickSort
{
    public static void Sort(int[] arr, int low, int high)
    {
        Stack stack = new Stack();
        stack.Push(low);
        stack.Push(high);

        while (stack.Count > 0)
        {
            high = stack.Pop();
            low = stack.Pop();

            int pivot = Partition(arr, low, high);

            if (pivot - 1 > low)
            {
                stack.Push(low);
                stack.Push(pivot - 1);
            }

            if (pivot + 1 < high)
            {
                stack.Push(pivot + 1);
                stack.Push(high);
            }
        }
    }

    public 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++;
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }

        int temp1 = arr[i + 1];
        arr[i + 1] = arr[high];
        arr[high] = temp1;

        return i + 1;
    }

    public static void PrintArray(int[] arr)
    {
        foreach (int num in arr)
        {
            Console.Write(num + " ");
        }
        Console.WriteLine();
    }

    public static void Main()
    {
        int[] arr = { 12, 11, 13, 5, 6, 7 };
        int n = arr.Length;

        Console.WriteLine("Original array:");
        PrintArray(arr);

        Sort(arr, 0, n - 1);

        Console.WriteLine("Sorted array:");
        PrintArray(arr);
    }
}

未经允许不得转载 » 本文链接:https://www.117.info/ask/fe13cAzsIBQFWBF0.html

推荐文章

  • C++成员函数指针与继承关系如何

    在C++中,成员函数指针与继承关系之间存在一些复杂性。成员函数指针是指向类成员函数的指针,包括非静态成员函数和静态成员函数。当涉及到继承关系时,情况变得更...

  • C++成员函数指针在设计模式中的应用

    C++成员函数指针在设计模式中有多种应用,在设计模式中常用的设计模式有策略模式、观察者模式和命令模式等,下面分别介绍成员函数指针在这些设计模式中的应用: ...

  • C++成员函数指针如何实现回调

    要实现回调功能,可以使用C++类的成员函数指针作为回调函数的参数,然后在需要执行回调的地方调用该函数指针。
    首先定义一个类,其中包含一个成员函数指针作...

  • 为什么要使用C++成员函数指针

    使用C++成员函数指针可以实现面向对象编程的一些高级特性,如回调函数、事件处理、设计模式等。通过成员函数指针,可以动态地指定对象的成员函数,并在运行时调用...

  • c#快速排序在大数据量下表现

    在大数据量下,C#快速排序算法的性能表现通常是非常高效的。快速排序算法的平均时间复杂度为O(n log n),在最坏情况下为O(n^2)。然而,由于快速排序算法的平均时...

  • c#快速排序的内存消耗分析

    快速排序是一种原地排序算法,它的空间复杂度为O(1),即不需要额外的空间来存储数据,只需要对原始数据进行递归的分区操作即可。因此,快速排序的内存消耗主要来...

  • c#快速排序如何处理重复元素

    在快速排序中处理重复元素的方法是通过增加一个判定条件来确保不再对重复元素进行排序。具体来说,可以在划分数组时,将与基准元素相等的元素放到基准元素的左边...

  • c#快速排序的性能优化策略

    使用三数取中法选择枢纽元素:在快速排序算法中,选择合适的枢纽元素对算法的性能有显著影响。通常情况下,选择数组的第一个元素或最后一个元素作为枢纽元素可能...