• 快速排序


    快速排序使用归并思想,对于子数组A[p..r],有如下三步分治过程:

    1. 分解:划分为A1[p..q-1]和A2[q+1..r],使得A1元素比A[q]小,A2元素比A[q]大
    2. 解决:递归调用快速排序,对分解的数组A1和A2进行排序
    3. 合并:因为子数组都是原址排序,不需要排序,数组A[p..r]已经有序
    static void QuickSort(List<int> sq, int s, int e)
    {
        if (s < e)
        {
            int st = Partition(sq, s, e);
            QuickSort(sq, s, st-1);
            QuickSort(sq, st+1, e);
        }
    }

    其中Partition部分将会选择一个元素作为主元(一般是最后一个),将元素分割两个部分,前边一部分小于主元,后边一部分大于主元

    static int Partition(List<int> sq, int s, int e)
    {
        int pivotElement = sq[e];
        int i = s - 1;
        for (int j = s; j < e; j++)
        {
            if (sq[j] <= pivotElement)
            {
                i++;
                int temp1 = sq[i];
                sq[i] = sq[j];
                sq[j] = temp1;
            }
        }
        i++;
        int temp = sq[i];
        sq[i] = sq[e];
        sq[e] = temp;
        return i;
    }

    使用快速排序,在最坏的情况下为Θ(n^2),期望运行时间为Θ(nlg(n)).期望运行时间是在输入序列的所有排列都是等概率的,但工程中,并不总是成立,为此可以引入随机化。

    随机化中,将随机的以为元素与最后一个元素交换。

    static void RandomizedQuickSort(List<int> sq, int s, int e)
    {
        if (s < e)
        {
            int st = RandomizedPartition(sq, s, e);
            RandomizedQuickSort(sq, s, st - 1);
            RandomizedQuickSort(sq, st + 1, e);
        }
    }
    static int RandomizedPartition(List<int> sq, int s, int e)
    {
        int i = rand.Next(s, e);
        int temp = sq[i];
        sq[i] = sq[e];
        sq[e] = temp;
        return Partition(sq, s, e); 
    }
  • 相关阅读:
    Privacy Policy
    privacy
    将一个无法一次读入内存的大文件排序
    java实现二叉树的非递归遍历
    java静态方法同步问题
    关于java静态方法继承问题
    Android 代码写布局
    Android自定义ImageView实现手势放大图片的控件,无需依赖任何第三方。
    Gradle版本更换问题
    Android的AlertDialog实现圆角边框
  • 原文地址:https://www.cnblogs.com/qiusuo/p/5211359.html
Copyright © 2020-2023  润新知