• 排序算法之快速排序


    直接上代码:

    void swap(int a[],int m,int n) {
        int temp = a[m];
        a[m] = a[n];
        a[n] = temp;
    }
    //开始的时候left是数组的起始位置0,right是数组最后一个元素的下标(这里是8)
    void quickSort(int a[],int left ,int right) {
    //从小到大排序{50,10,90,30,70,40,80,60,20}
        int low = left;
        int high = right;
        int partition = a[low];
        if (left>=right) {
            return;
        }
        
        while (low!=high) {
            while (low<high &&a[high]>=partition) {   //如果右边值大于partition
                high--;
            }
            if (low<high) {
                  swap(a, low, high);
            }
          
            while (low<high && a[low]<=partition) {
                low++;
            }
            if (low<high) {
                swap(a, low, high);
            }
         
        }
    //    printArr(a,9);
        quickSort(a, left, low-1);
        quickSort(a, low+1, right);
    }

    这里我定义了一个排序算法,一个交换算法。

    不太理解?看着太复杂?那就往下看吧。

    先介绍一下其原理:(这里我们按照从小到大排序)

    首先,需要找第一个或者最后一个元素作为枢纽,然后用枢纽将数组分成两部分,大于枢纽的放在枢纽右边,小于枢纽的放在枢纽左边。举个栗子:

    {50,30,40,74,23,67,56,68};

    这个数组中我们选择第一个元素作为枢纽50,那么我们要做的就是把数组中小于50的数都放到50左边,大于50的数放在50右边。但是左边(或右边)的数不一定有序。例如

    {30,40,23,50,74,56,67,68}

    这样只是大致有序。

    然后我们将枢纽50左边和右边分开,即成为两个数组

    {30,40,23}和{74,56,67,68}

    然后在按照上边的方法找一个枢纽再次进行排序:

    将30作为枢纽,得到结果:{23,30,40}这样左边就有序了;

    然后对于另一个数组进行同样的操作。直至所有有序。

    现在再看一下上边的代码吧,应该有点好理解了吧。

    ----------------------------------------教你一招----------------------------------------

    理解了上面所说的原理之后,然后自己编写代码。或者就直接把我上边的代码拷贝一下进行断点分析,这样就能够更深刻的理解然后自己写出来。

    ----------------------------------------结束了----------------------------------------

    如果有啥疑问的尽管开口,知无不言。

    如果有什么意见或建议,尽管提出。

    谢谢。

  • 相关阅读:
    Git查询
    HDU-3038 How Many Answers Are Wrong 并查集
    CodeForcesEducationalRound40-D Fight Against Traffic 最短路
    HDU-6109 数据分割 并查集(维护根节点)
    ZOJ-3261 Connections in Galaxy War 并查集 离线操作
    AtCoderBeginner091-C 2D Plane 2N Points 模拟问题
    HDU-1878 欧拉回路 欧拉回路
    [笔记-图论]Floyd
    [笔记-图论]Bellman-Ford
    [笔记-图论]Dijkstra
  • 原文地址:https://www.cnblogs.com/zhanggui/p/4741052.html
Copyright © 2020-2023  润新知