算法分析[排序]

1. 快速排序

快排最优复杂度是 O(n*log(n)),但是要使用辅助栈,总共要排序n次,每次查找中间值复杂度是O(logn)

75 快速排序, 此题用快排会超时,经典3种颜色,需要特殊处理

// 快排
void quick_sort(int[]arr, int low, inthigh){
         if (low>=high) return;
         // for找出中间值,O(logn)
         int i = partition(arr, low, high);
         // f(n/2) - 分治左
         quick_sort(arr, low, i-1);
         // f(n/2) - 分治右
         quick_sort(arr, i+1, high);
}
private int partition(int[] nums, int lo, int hi) {
        // 每次交换后, 都还是以p为中心点
        int p=nums[lo];
        while(lo<hi) {
            while(lo<hi && p<=nums[hi]) hi--;
            nums[lo]=nums[hi];
            // lo++; // 这里会导致数组为2时错误交换
            while(lo<hi && p>=nums[lo]) lo++;
            nums[hi]=nums[lo];
        }
        nums[lo]=p;
        return lo;
    }
// 空间换时间
private static void sortA(int[] nums) {
        Map<Integer, Integer> cs = new HashMap<>();
        for (int i : nums) {
            cs.put(i, cs.getOrDefault(i, 0) + 1);
        }
        int p = 0;
        for (Map.Entry<Integer, Integer> entry : cs.entrySet()) {
            Integer k = entry.getKey();
            Integer v = entry.getValue();
            for (int i = 0; i < v; i++) {
                nums[p++] = k;
            }
        }
    }
// 三色排序的特色,只需要2个标识能代表三色
// 中等值排在最前方,最小值每次出现都和中等值交换位置
// 最大值每次出现,都和最后k位交换位置
    private void quickB(int []nums) {
        // j 代表 1 开始的位置
        // k 代表 2 开始的位置
        int j=0, k=nums.length;
        for(int i=0; i<k; i++) {
            if(nums[i]==0) {
                swap(nums, i, j++);
            } else if(nums[i] == 2) {
                swap(nums, i--, --k);
            }
        }
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 11,397评论 0 13
  • 简单排序 插入排序 想象一下插队的过程... 一个人通过插队的方式排到前面,而将原本在他前面的人挤到了后面的位置。...
    Kasheem_Lew阅读 5,389评论 0 4
  • 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;不稳定:如果a原本在b的前面,而a=b,排序之后a可...
    意识流丶阅读 8,410评论 2 9
  • 2018年10月8日 /*本节主要内容:1、 时间复杂度2、冒泡排序3、选择排序4、插入排序5、对数器概念和使用6...
    须臾之北阅读 4,136评论 0 0
  • 近日,崔永元在微博上怒怼《手机2》团队,从导演冯小刚,编剧刘震云,到主演范冰冰无一幸免。 崔的第一炮让范冰冰给接了...
    杂弹张阅读 1,716评论 0 0