快速排序

作者: AceKitty | 来源:发表于2016-12-28 16:39 被阅读46次

    概念

    快速排序(Quicksort)是对冒泡排序的一种改进。

    原理

    快速排序采用的思想是分治思想。

    1. 选择一个基准元素,通常选择第一个元素或者最后一个元素,
    2. 通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的 元素值比基准值大。
    3. 此时基准元素在其排好序后的正确位置
    4. 然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。

    快速排序的示例:
    (a)一趟排序的过程:



    (b)排序的全过程


    算法描述(C语言)

    void quick_sort(int *a, int left, int right) {
        if (left >= right) {
            //如果左边索引大于或者等于右边的索引就代表已经整理完成一组了
            return;
        }
        int i = left;
        int j = right;
        int key = a[left];
        while (i < j) {
            while (i < j && key <= a[j]) {
                //寻找结束的条件就是
                //1.找到一个小于或者大于key的数(大于或小于取决于你想升序还是降序)
                //2.没有符合条件1的,并且i与j的大小没有反转
                j--;//向前寻找
            }
            a[i] = a[j];
            //找到一个这样的数后就把它赋给前面的被拿走的i的值(如果第一次循环且key是a[left],那么就是给key)
            while (i < j && key >= a[i]) {
                //这是i在当前组向前寻找,同上,不过注意与key的大小关系停止循环和上面相反,
                //因为排序思想是把数往两边扔,所以左右两边的数大小与key的关系相反
                i++;
            }
            a[j] = a[i];
        }
        a[i] = key;//当在当组内找完一遍后就把中间数key回归
        quick_sort(a, left, i - 1);//最后用同样的方式对分出来的左边的小组进行同样的做法
        quick_sort(a, i + 1, right);//用同样的方式对分出来的右边的小组进行同样的做法   直到每一组的i = j为止
    }
    
    int main() {
        int a[] = {49, 38, 65, 97, 76, 13, 27, 49};
        int len = sizeof(a)/sizeof(int);
        quick_sort(a, 0, len);
        for (int i = 0; i < len; i++) {
            printf("%d\n", a[i]);
        }
        return 0;
    }
    

    算法稳定性

    不稳定

    算法分析

    时间复杂度为O(n²)。

    相关文章

      网友评论

        本文标题:快速排序

        本文链接:https://www.haomeiwen.com/subject/txbyvttx.html