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

    快速排序算法思想:

    快速排序是冒泡排序的改进算法。它也是通过不断比较和移动交换来实现排序的,只不过它的实现增大了记录的比较和移动的距离,将关键字较大的元素从前面直接放到后面,关键字较小的元素直接从后面放到前面,从而减小了比较次数和交换次数。
     
    对于近乎有序的数组,可采用起始值为数组中随机数字,否则会退化成O^2级别
    对于含有大量重复的数组,可用左右两端双索引的方式去向中间靠拢排序,否则会退化成O^2级别(双路快速排序)
    对于上面两个问题,最终优化使用三路快速排序,大于基准元素部分,小于基准元素部分和等于基准元素部分,之后对于小于,大于进行递归

    v1版实现

    template<typename T>
    int __partition(T arr[],int l,int r){
        T v = arr[l];
        int j = l;
        for(int i = l+1;i<=r;i++)
            if (arr[i] < v){
                swap(arr[j+1],arr[i]);
                j++;
            }
        swap(arr[l],arr[j]);
    }
    
    
    template<typename T>
    void __quickSort(T arr[],int l,int r){
        if(l >= r)
            return;
        int p = __partition(arr,l,r);
        __quickSort(arr,l,p-1);
        __quickSort(arr,p+1,r);
    }
    
    //快速排序
    template<typename T>
    void quickSort(T arr[],int n){
        __quickSort(arr,0,n-1)
    }
  • 相关阅读:
    20205025模拟
    CDQ分治详解
    点分治详解
    虚树详解
    整体二分详解
    算法学习————线段树合并
    Mvc.ExceptionHandling.AbpExceptionFilter
    小程序前端转换时间格式2021-02-25T12:01:20.254748
    《生命3.0—在亿年的尺度下审视生命的演进》阅读笔记1
    软件杯赛题周总结(1)
  • 原文地址:https://www.cnblogs.com/Erick-L/p/12593575.html
Copyright © 2011-2022 走看看