使用概率算法优化快速排序(JAVA)

前言


  前面一篇文章系统介绍了快速排序算法,提到快速排序虽然平均时间复杂度为o(n*log2(n)),效率相对比较高。但是其在特殊情况下,比如降序的情况下,效率和冒泡排序一致,这就削弱了快速排序给人的好感。然而有没有办法,能够解决这种问题,使快速排序的时间复杂度与输入序列无关呢?答案是有的,使用舍伍德概率算法能够帮助解决这个问题。

舍伍德算法


  舍伍德算法是三大概率算法之一,它的实质就是通过随机概率解决问题与输入顺序的关联,从而优化问题的解决。舍伍德算法还可用于层级链表问题,后续写概率算法时会进一步提到。

优化


  思路很简单,为了使排序与输入序列顺序无关,在划分基准时,我们确定一个随机基准(low到high之间的一个随机位置),将它与第一位(默认基准)进行交换,而后再进行基准位确定,进而分治快速排序其左半部分与右半部分。

Codes


package com.fairy.InnerSort;

import java.util.Scanner;
/**
 * 舍伍德算法优化快速排序
 * @author Fairy2016
 *
 */
public class QuickSort {

    //快速排序
    public static void sort(int a[], int low, int high) {
        if(low < high) {
            int base = Depart(a, low, high);
            //对基准左半边部分进行排序
            sort(a, low, base-1);
            //对基准右半边部分进行排序
            sort(a, base+1, high);
        }
    }
    //基准划分
    public static int Depart(int a[], int low, int high) {
        //舍伍德随机确定基准
        int d = (int)Math.random()*(high-low)+low;
        //交换默认基准与随机基准
        a[0] = a[d];
        a[d] = a[low];
        a[low] = a[0];
        while(low < high) {
            //从右向左扫描找比基准小的元素
            while(low < high && a[high] >= a[0])
                high--;
            a[low] = a[high];//赋值,更新基准位
            //从左向右扫描找比基准大的元素
            while(low < high && a[low] <= a[0]) 
                low++;
            a[high] = a[low];//赋值,更新基准位
        }
        //基准位最终位置已确定,是low或者high
        a[high] = a[0];
        return high;
    }
    
    public static void Print(int a[], int n) {
        for(int i = 1; i <= n; i++) {
            System.out.print(a[i]+" ");
        }
    }

    public static void main(String args[]) {
        int n;
        int a[];
        Scanner scanner = new Scanner(System.in);
        while(scanner.hasNext()) {
            n = scanner.nextInt();
            if(n > 0) {
                a = new int[n+1];
                for(int i=1; i <= n; i++) {
                    a[i] = scanner.nextInt();
                }
                sort(a, 1, n);
                Print(a, n);
            }
        }
        scanner.close();
    }
}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一. 写在前面 要学习算法,“排序”是一个回避不了的重要话题,在分析完并查集算法和常用数据结构之后,今天我们终于可...
    Leesper阅读 7,330评论 0 40
  • 概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的...
    Luc_阅读 6,818评论 0 35
  • 膨胀的滴滴, 在混战之后,滴滴在专车领域基本实现垄断之后,一直以来滴滴想要做一个“大一统”的出行平台。这几年来,从...
    牛顶风阅读 5,934评论 5 17
  • 昨天的一篇关于丈母娘的文章,引发了许多人对这样一个事情的讨论。但是作为许多女性朋友的闺蜜的二爷我来说,也有女生在和...
    二爺阅读 1,589评论 0 0
  • 死神笔记 简介:一本散落的笔记被有缘人捡到,引起了一所高校前所未有的恐慌,到底是人为的因素还是...
    1b35e0735b76阅读 1,202评论 0 0

友情链接更多精彩内容