• 快速排序总结


        快速排序是相当重要的一种排序方法。它的特点有:

    1. 平均时间复杂度为O(nlogn),最坏时间复杂度为O(n^2)。

    2. 平均空间复杂度为O(logn),最坏空间复杂度为O(n)。

    3. 不稳定

        快排的实现方法有多种,这里只列出常用的两种。

    单向扫描版:

    int partition(int arr[], int p, int r)
    {
        int x = arr[r];
        int i = p - 1;
        for (int j = p; j < r; ++j)
        {
            if (arr[j] <= x)
            {
                ++i;
                swap(arr[i], arr[j]);
            }
        }
        swap(arr[i+1], arr[r]);
        return i + 1;
    }

    双向扫描版:

    int partition(int *a,int p,int r)
    {
        int i = p,j = r;
        int x = a[p];
        while (i < j)
        {
            while (i < j && a[j] >= x)
                j--;
            if (i < j)
                a[i++] = a[j];
            while (i < j && a[i] <= x)
                i++;
            if (i < j)
                a[j--] = a[i];
        }
        a[i] = x;
        return i;
    }

    主调用:

    void QuickSort(int *a,int p,int r)
    {
        if (p<r)
        {
            int q = partition(a,p,r);
            QuickSort(a,p,q-1);
            QuickSort(a,q+1,r);
        }
    }

        递归是实现快排的主要策略。当然也可以非递归实现快排。

    快排非递归版:

    void quicksortIterative(int arr[], int s, int e)
    {
        stack<int> stk;
        stk.push(s);
        stk.push(e);
        while (!stk.empty())
        {
            int end = stk.top();
            stk.pop();
            int start = stk.top();
            stk.pop();
            int mid = partition(arr, start, end);
            if (start < mid - 1)
            {
                stk.push(start);
                stk.push(mid - 1);
            }
            if (mid + 1 < end)
            {
                stk.push(mid + 1);
                stk.push(end);
            }
        }
    }

    参考文档:

    快速排序-递归和非递归的实现

  • 相关阅读:
    ASP.NET Core
    ASP.NET Core
    ASP.NET Core
    ASP.NET Core
    通用查询设计思想(2)- 基于ADO.Net的设计
    API接口通讯参数规范(2)
    Centos7 安装selenium(python3.7 centos7 )
    mysql (create temporary table table_name )临时表创建
    C# 字符串 String、StringBuffer和StringBuilder的区别
    安装Elasticsearch
  • 原文地址:https://www.cnblogs.com/gattaca/p/4703809.html
Copyright © 2020-2023  润新知