专业的JAVA编程教程与资源

网站首页 > java教程 正文

java数据结构与算法之快速排序(用java实现快速排序算法)

temp10 2024-10-31 15:08:00 java教程 10 ℃ 0 评论

快速排序原理

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

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

java数据结构与算法之快速排序(用java实现快速排序算法)

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

快速排序步骤

① 从数列中挑出一个元素,称为 “基准”(pivot);

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

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

递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

快速排序java代码

// quickSort1.java
// demonstrates simple version of quick sort
// to run this program: C>java QuickSort1App
////////////////////////////////////////////////////////////////
package com.datastructure;

class ArrayIns {
    private long[] theArray; // ref to array theArray
    private int nElems; // number of data items

    //--------------------------------------------------------------
    public ArrayIns(int max) // constructor
    {
        theArray = new long[max]; // create the array
        nElems = 0; // no items yet
    }

    //--------------------------------------------------------------
    public void insert(long value) // put element into array
    {
        theArray[nElems] = value; // insert it
        nElems++; // increment size
    }

    //--------------------------------------------------------------
    public void display() // displays array contents
    {
        System.out.print("A=");
        for (int j = 0; j < nElems; j++) {// for each element,
            System.out.print(theArray[j] + " "); // display it
        }
        System.out.println("");
    }

    //--------------------------------------------------------------
    public void quickSort() {
        recQuickSort(0, nElems - 1);
    }

    //--------------------------------------------------------------
    public void recQuickSort(int left, int right) {
        if (right - left <= 0) { // if size <= 1,
            return; // already sorted
        }
        else // size is 2 or larger
        {
            long pivot = theArray[right]; // rightmost item
            // partition range
            int partition = partitionIt(left, right, pivot);
            recQuickSort(left, partition - 1); // sort left side
            recQuickSort(partition + 1, right); // sort right side
        }
    } // end recQuickSort()

    //--------------------------------------------------------------
    public int partitionIt(int left, int right, long pivot) {
        int leftPtr = left - 1; // left (after ++)
        int rightPtr = right; // right-1 (after --)
        while (true) { // find bigger item
            while (theArray[++leftPtr] < pivot) {
                ; // (nop)
            }
            // find smaller item
            while (rightPtr > 0 && theArray[--rightPtr] > pivot) {
                ; // (nop)
            }
            if (leftPtr >= rightPtr) { // if pointers cross,
                break; // partition done
            }else { // not crossed, so
                swap(leftPtr, rightPtr); // swap elements
            }
        } // end while(true)
        swap(leftPtr, right); // restore pivot
        return leftPtr; // return pivot location
    } // end partitionIt()

    //--------------------------------------------------------------
    public void swap(int dex1, int dex2) // swap two elements
    {
        long temp = theArray[dex1]; // A into temp
        theArray[dex1] = theArray[dex2]; // B into A
        theArray[dex2] = temp; // temp into B
    } // end swap(
//--------------------------------------------------------------
} // end class ArrayIns

////////////////////////////////////////////////////////////////
class QuickSort1App {
    public static void main(String[] args) {
        int maxSize = 16; // array size
        ArrayIns arr;
        arr = new ArrayIns(maxSize); // create array
        for (int j = 0; j < maxSize; j++) // fill array with
        { // random numbers
            long n = (int) (java.lang.Math.random() * 99);
            arr.insert(n);
        }
        arr.display(); // display items
        arr.quickSort(); // quicksort them
        arr.display(); // display them again
    } // end main()
} // end class QuickSort1App
////////////////////////////////////////////////////////////////

快速排序效率

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

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表