java快速排序简单代码

Python011

java快速排序简单代码,第1张

.example-btn{color:#fffbackground-color:#5cb85cborder-color:#4cae4c}.example-btn:hover{color:#fffbackground-color:#47a447border-color:#398439}.example-btn:active{background-image:none}div.example{width:98%color:#000background-color:#f6f4f0background-color:#d0e69cbackground-color:#dcecb5background-color:#e5eeccmargin:0 0 5px 0padding:5pxborder:1px solid #d4d4d4background-image:-webkit-linear-gradient(#fff,#e5eecc 100px)background-image:linear-gradient(#fff,#e5eecc 100px)}div.example_code{line-height:1.4emwidth:98%background-color:#fffpadding:5pxborder:1px solid #d4d4d4font-size:110%font-family:Menlo,Monaco,Consolas,"Andale Mono","lucida console","Courier New",monospaceword-break:break-allword-wrap:break-word}div.example_result{background-color:#fffpadding:4pxborder:1px solid #d4d4d4width:98%}div.code{width:98%border:1px solid #d4d4d4background-color:#f6f4f0color:#444padding:5pxmargin:0}div.code div{font-size:110%}div.code div,div.code p,div.example_code p{font-family:"courier new"}pre{margin:15px autofont:12px/20px Menlo,Monaco,Consolas,"Andale Mono","lucida console","Courier New",monospacewhite-space:pre-wrapword-break:break-allword-wrap:break-wordborder:1px solid #dddborder-left-width:4pxpadding:10px 15px} 排序算法是《数据结构与算法》中最基本的算法之一。排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。以下是快速排序算法:

快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较。在最坏状况下则需要 Ο(n2) 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。

快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。

快速排序又是一种分而治之思想在排序算法上的典型应用。本质上来看,快速排序应该算是在冒泡排序基础上的递归分治法。

快速排序的名字起的是简单粗暴,因为一听到这个名字你就知道它存在的意义,就是快,而且效率高!它是处理大数据最快的排序算法之一了。虽然 Worst Case 的时间复杂度达到了 O(n?),但是人家就是优秀,在大多数情况下都比平均时间复杂度为 O(n logn) 的排序算法表现要更好,可是这是为什么呢,我也不知道。好在我的强迫症又犯了,查了 N 多资料终于在《算法艺术与信息学竞赛》上找到了满意的答案:

快速排序的最坏运行情况是 O(n?),比如说顺序数列的快排。但它的平摊期望时间是 O(nlogn),且 O(nlogn) 记号中隐含的常数因子很小,比复杂度稳定等于 O(nlogn) 的归并排序要小很多。所以,对绝大多数顺序性较弱的随机数列而言,快速排序总是优于归并排序。

1. 算法步骤

从数列中挑出一个元素,称为 "基准"(pivot)

重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;

递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;

2. 动图演示

代码实现 JavaScript 实例function quickSort ( arr , left , right ) {

    var len = arr. length ,

        partitionIndex ,

        left = typeof left != 'number' ? 0 : left ,

        right = typeof right != 'number' ? len - 1 : right

    if ( left

① 代码:

public class quicksortdemo {

    

    private int array[]

    private int length

    public void sort(int[] inputArr) {

        

        if (inputArr == null || inputArr.length == 0) {

            return

        }

        this.array = inputArr

        length = inputArr.length

        quickSort(0, length - 1)

    }

    private void quickSort(int lowerIndex, int higherIndex) {

        

        int i = lowerIndex

        int j = higherIndex

        // calculate pivot number

        int pivot = array[lowerIndex+(higherIndex-lowerIndex)/2]

        // Divide into two arrays

        while (i <= j) {

            while (array[i] < pivot) {

                i++

            }

            while (array[j] > pivot) {

                j--

            }

            if (i <= j) {

                swap(i, j)                

                i++

                j--

            }

        }

        // call quickSort() method recursively

        if (lowerIndex < j)

            quickSort(lowerIndex, j)

        if (i < higherIndex)

            quickSort(i, higherIndex)

    }

    private void swap(int i, int j) {

        int temp = array[i]

        array[i] = array[j]

        array[j] = temp

    }

    

    public static void main(String a[]){

        

        quicksortdemo sorter = new quicksortdemo()

        int[] input = {24,2,45,20,56,75,2,56,99,53,12}

        sorter.sort(input)

        for(int i:input){

            System.out.print(i)

            System.out.print(" ")

        }

    }

}

② 运行:

c:\>java quicksortdemo

2 2 12 20 24 45 53 56 56 75 99

本人特地给你编的代码\x0d\x0a亲测\x0d\x0a\x0d\x0apublicclassQuickSort{\x0d\x0a\x0d\x0apublicstaticintPartition(inta[],intp,intr){\x0d\x0aintx=a[r-1]\x0d\x0ainti=p-1\x0d\x0ainttemp\x0d\x0afor(intj=pjif(a[j-1]//swap(a[j-1],a[i-1])\x0d\x0ai++\x0d\x0atemp=a[j-1]\x0d\x0aa[j-1]=a[i-1]\x0d\x0aa[i-1]=temp\x0d\x0a\x0d\x0a}\x0d\x0a}\x0d\x0a//swap(a[r-1,a[i+1-1])\x0d\x0atemp=a[r-1]\x0d\x0aa[r-1]=a[i+1-1]\x0d\x0aa[i+1-1]=temp\x0d\x0a\x0d\x0areturni+1\x0d\x0a\x0d\x0a}\x0d\x0a\x0d\x0apublicstaticvoidQuickSort(inta[],intp,intr){\x0d\x0a\x0d\x0aif(p