zoukankan      html  css  js  c++  java
  • 快速排序

    快速排序是不稳定的排序,并且其中逻辑比较怪。

    网上的教程一般只介绍第一轮排序,省略第二轮

    以至于学习时把分割子序列的步骤给漏了,浪费了不少时间

    这里推荐这个文章,非常详细:http://www.cnblogs.com/jingmoxukong/p/4302891.html

    首先取一个关键数,并不断来回和左右两边的数做比较

    然后交换位置,直到左右两边都没有可以交换的数时,一轮结束

    将左右两边分别拆成子序列,分别再进行快速排序

    直到左右两边的数字不能再拆为止。

    以一串数为例:5,1,3,2,1。5作为关键字

    1 - 比较左侧,没有可交换,5,1,3,2,1

    2 - 比较右侧,5和1交换,1,5,3,2,1

    3 - 比较左侧,没有可交换,1,5,3,2,1

    4 - 比较右侧,5和1交换,1,1,3,2,5

    5 - 发现没有交换,对5左右两侧进行拆分,{1,1,3,2}和{}。对左侧序列以1为关键字继续排序

    6 - 1,1,3,2,左右没有可交换,将1,3,2拆出继续排序

    7 - 1,3,2,左右没有可交换,将3,2拆出继续排序

    8 - 3,2,比较左侧没有可交换,比较右侧2与3交换

    9 - 所有子序列无法拆分,排序结束。结果:1,1,2,3,5

    脚本(以中间数作为关键数):

    [ContextMenu("Test")]
    void Test()
    {
        var array = new int[] { 13, 34, 1, 5, 21, 3, 2, 8, 1 };
        Quick_Sort(array);
    
        Debug.Log("Final: " + string.Join(",", array.Select(m => m.ToString()).ToArray()));
    }
    
    void Quick_Sort(int[] array)
    {
        Quick_Sort(array, 0, array.Length - 1);
    }
    
    void Quick_Sort(int[] array, int leftIndex, int rightIndex)
    {
        if (rightIndex - leftIndex < 2) return;
    
        var key = leftIndex + ((rightIndex - leftIndex) / 2);
        var direction = -1;
        var flag = 0;
    
        while (true)
        {
            if (direction == -1)
            {
                for (int i = leftIndex; i <= key; i++)
                {
                    if (array[i] > array[key])
                    {
                        Swap(array, i, key);
                        key = i;
                        flag = -1;
                        break;
                    }
                }
            }
            else
            {
                for (int i = key + 1; i <= rightIndex; i++)
                {
                    if (array[key] > array[i])
                    {
                        Swap(array, i, key);
                        key = i;
                        flag = -1;
                        break;
                    }
                }
            }
    
            direction *= -1;
            flag++;
    
            //左右两边都没有的情况
            if (flag == 2)
            {
                //再拆分成两个子序列进行排序
                Quick_Sort(array, 0, key);
                Quick_Sort(array, key + 1, rightIndex);
                break;
            }
        }
    }
    
    void Swap(int[] array, int x, int y)
    {
        var tmp = array[x];
        array[x] = array[y];
        array[y] = tmp;
    }

    打印:1,1,2,3,5,8,13,21,34

  • 相关阅读:
    《信息安全专业导论》第十一周学习总结
    模拟进程
    GPG实践
    信安导论2020-2021上第十三周总结(20201222)
    NMap
    信安导论2020-2021上第十二周总结(20201222)
    python模拟进程状态
    信安导论2020-2021上第十一周总结(20201222)
    信安导论2020-2021上第十周总结(20201222)
    Openssl 20201332
  • 原文地址:https://www.cnblogs.com/hont/p/6444305.html
Copyright © 2011-2022 走看看