快速排序(经典快排以及随机快排)

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

快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

首先来了解一下经典快排:

其中就小于等于的区域可以优化一下,小于的放小于区域,等于的放等于区域,大于的放大于区域。可以利用荷兰国旗问题

荷兰国旗问题:

给定一个数组arr,和一个数num,请把小于num的数放在数组的 左边,等于num的数放在数组的中间,大于num的数放在数组的 右边。

这就是荷兰国旗问题,大致过程如图:

代码如下

public class Code5_NetherlandsFlag {

    public static int[] partition(int[] arr, int l, int r, int num) {
        int less = l - 1;
        int more = r + 1;
        while (l < more) {
            if (arr[l] < num) {
                swap(arr, ++less, l++);
            } else if (arr[l] > num) {
                swap(arr, --more, l);
            } else {
                l++;
            }
        }
        return new int[] { less + 1, more - 1 };
    }
    public static void swap(int[] arr, int i, int j) {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }
}

优化后快排代码为:

    public static void quickSort(int[] arr) {
        if (arr == null || arr.length < 2) {
            return;
        }
        quickSort(arr, 0, arr.length - 1);
    }

    public static void quickSort(int[] arr, int l, int r) {
        if (l < r) {
            swap(arr, l + (int) (Math.random() * (r - l + 1)), r);
            int[] p = partition(arr, l, r);
            quickSort(arr, l, p[0] - 1);
            quickSort(arr, p[1] + 1, r);
        }
    }

    public static int[] partition(int[] arr, int l, int r) {
        int less = l - 1;
        int more = r;
        while (l < more) {
            if (arr[l] < arr[r]) {
                swap(arr, ++less, l++);
            } else if (arr[l] > arr[r]) {
                swap(arr, --more, l);
            } else {
                l++;
            }
        }
        swap(arr, more, r);
        return new int[] { less + 1, more };
    }

    public static void swap(int[] arr, int i, int j) {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }

其中swap(arr, l + (int) (Math.random() * (r - l + 1)), r);这一句是为了将快排受数据状态的影响变成一个概率性的,随机的

原文地址:https://www.cnblogs.com/pipipi/p/9460249.html

时间: 2024-10-03 13:38:48

快速排序(经典快排以及随机快排)的相关文章

快排,随机快排,双路快排,三路快排的理解

再讲快排之前,首先对于任何一个数组,无论之前是多么杂乱,排完之后是不是一定存在一个数作为分界点(也就是所谓的支点),在支点左边全是小于等于这个支点的,然后在这个支点右边的全是大于等于这个支点的,快排过程就是寻找这个支点过程 先看普通的快排(普通单路快排) 代码如下 let findIndex = (arr, l, len) => { let par = arr[l], j = l for (let i = l + 1; i <= len; i++) { if (arr[i] < par)

随机快排算法

1 package Sort; 2 3 import org.junit.Test; 4 5 // 随机快排算法 6 public class RandQuickSort { 7 8 // 交换数组中的两个元素 9 public void exchange(int[] array, int index1, int index2) { 10 int tmp = array[index1]; 11 array[index1] = array[index2]; 12 array[index2] = t

随机快排

#include<stdio.h> int PARTITION(int*A,int p,int r)//分治 { int x=A[r-1]; int i=p-1; int j=p; int temp; while(j<=r-1) { if(A[j-1]<=x) { i++; temp=A[i-1]; A[i-1]=A[j-1]; A[j-1]=temp; } j++; } temp=A[i]; A[i]=A[r-1]; A[r-1]=temp; return i+1; } int

数学之美番外篇:快排为什么那样快

目录 0. 前言 1. 猜数字 2. 称球 3. 排序 3.1 为什么堆排比快排慢 3.2 为什么快排其实也不是那么快 3.3 基排又为什么那么快呢 4. 信息论!信息论? 5. 小结 0. 前言 知道这个理论是在TopLanguage上的一次讨论,先是g9转了David MacKay的一篇文章,然后引发了牛人们的一场关于信息论的讨论.Anyway,正如g9很久以前在Blog里面所说的: 有时无知是福.俺看到一点新鲜的科普也能觉得造化神奇.刚才读Gerald Jay Sussman(SICP作者

[转] 快排为什么那样快

原文:数学之美番外篇:快排为什么那样快 1. 猜数字 我们先来玩一个猜数字游戏:我心里默念一个1~64之间的数,你来猜(你只能问答案是"是"或"否"的问题).为了保证不论在什么情况下都能以尽量少的次数猜中,你应该采取什么策略呢?很显然,二分.先是猜是不是位于1~32之间,排除掉一半可能性,然后对区间继续二分.这种策略能够保证无论数字怎么跟你捉迷藏,都能在log_2{n}次以内猜中.用算法的术语来说就是它的下界是最好的. 我们再来回顾一下这个游戏所蕴含的本质:为什么这

2015.8.7 数学之美番外篇:快排为什么那样快 读后感

数学之美番外篇:快排为什么那样快 读后感 书中所举得例子,不论是12个小球还是排序问题,解的可能性很多,但是最终的结果只有一个.因此我需要用我所能做的操作来寻找到解空间,其中涉及关键问题:为了寻找到正确的解,我需要做什么. 首先,寻找正确的解的过程可以看做是一个逐步排除错误的解的过程.我们可以假设我的正确的解可能随机为任何一种可能,如果我的每一步能够排除掉尽可能多的解,那么我就能最快的找到我想要的解.但是我能不能使得我的每次划分都去掉一大部分呢?这是一个trade-off的问题,尽管有的时候我可

态度排第一、能力排第二、学历排第三

态度排第一.能力排第二.学历排第三 留个记录.回头补文章

哈林电子会员卡软件,升级会员微信预约排号功能,商家会员无需等待,远程预约排号,微排号系统源码

 哈林电子会员卡软件,升级会员微信预约排号功能,商家会员无需等待,远程预约排号,微排号系统源码 2015年1月4日,哈林科技旗下的电子会员卡管理软件,如期完成会员微信预约排队功能的升级,以下简称[微排队] 本软件的开发旨在给商家提供一个实用,可操作性强的电子会员卡管理平台. 微排队功能的推出主要实现以下功能: 1.商家可以在电子会员卡软件中心实时查看会员近5天内的微信预约,帮助商家合理调配人力 2.电子会员卡软件提供给商家自定义设定每个消费项目每天能服务预约的人数限制 3.商家可以通过软件合

关于快排与随机化快排

快排是我们比较熟悉的排序算法,时间复杂度最佳为O(nlogn),最坏为O(n2)随机化快排只是通过换轴将产生最坏情况可能性降低 1 #include<stdio.h> 2 #include<math.h> 3 #include<stdlib.h> 4 #include<iostream> 5 #include<time.h> 6 using namespace std; 7 8 int a[1000000]; 9 int Partition(in