zoukankan      html  css  js  c++  java
  • 快速排序(三数中值、三向切分、转插入排序)

    再次优化快速排序,三数中值取理想的pivot,三向切分忽略与pivot相同的元素,小数组转插入排序

    (唯一不足递归实现,不过是尾递归,编译器可以优化掉)

    代码很短,而且可读性很好,记录于此以供参考

    const int cutoff = 3;
    
    void insertSort(int a[], int len)
    {
        for (int i = 1; i < len; ++i)
        {
            int j;
            int temp = a[i];
            for (j = i - 1; j >= 0; --j)
            {
                if (a[j] <= temp)
                    break;
                a[j + 1] = a[j];
            }
            a[j + 1] = temp;
        }
    }
    
    void swap(int *a, int *b)
    {
        int temp = *a;
        *a = *b;
        *b = temp;
    }
    
    void quickSort(int a[], int left, int right)
    {
        // 转插入排序
        if (left + cutoff > right)
            return insertSort(a + left, right - left + 1);
        // 三数中值 让left为中值
        int center = (left + right) >> 1;
        if (a[left] < a[center])
            swap(&a[left], &a[center]);
        if (a[center] > a[right])
            swap(&a[center], &a[right]);
        if (a[left] > a[right])
            swap(&a[left], &a[right]);
        // 三向切分
        int lt = left, i = left + 1, rt = right;
        int temp = a[left];
        while (i <= rt)
        {
            if (a[i] < temp)
                swap(&a[lt++], &a[i++]);
            else if (a[i] > temp)
                swap(&a[i], &a[rt--]);
            else
                i++;
        }
        quickSort(a, left, lt - 1);
        quickSort(a, rt + 1, right);
    }
  • 相关阅读:
    Java学习
    Java学习
    Java学习
    Java学习
    Java学习
    Java 泛型(六):泛型
    Java 泛型(五):泛型
    第十六章:垃圾回收(Garbage Collection)相关概念
    Java 泛型(四):泛型
    Java 泛型(三):泛型在继承方面体现与通配符使用
  • 原文地址:https://www.cnblogs.com/sdlwlxf/p/5121170.html
Copyright © 2011-2022 走看看