快速排序

快速排序也是nlogn的算法,而且它在面對(duì)完全無序時(shí)是比歸并排序快的,但是它面對(duì)完全有序,或者重復(fù)數(shù)多的數(shù)組又顯得無力退化到n2.

下面我們來介紹一下快速排序

主要使用遞歸

選擇第一個(gè)點(diǎn)作為比較點(diǎn),小于該點(diǎn)的數(shù)放在該點(diǎn)的左邊,大于該點(diǎn)的數(shù)放在該點(diǎn)的右邊

如果第i個(gè)元素比v大的話,就i++
如果第i個(gè)元素比v小的話,就會(huì)將第i個(gè)元素與j+1元素交換


最后將l處的v元素與第j個(gè)元素交換位置

算法實(shí)現(xiàn):

import java.lang.reflect.Array;

import java.util.Arrays;

public class paixu {

public? static? void main(String args[])

{

Integer array[]=new Integer[10000];

? ? ? ? for (int i =0; i <10000; i++)

array[i] =new Integer((int)(Math.random() * (10000+1) ));

? ? ? paixu(array);

? ? ? ? for (int i =0; i <10000; i++)

System.out.println(array[i]);

? ? }

public? static? void paixu(Comparable[] array)

{

sort(array,0,array.length-1);

? ? }

public static void sort(Comparable[] array,int l,int r)

{

if(l>=r)

return;

? ? ? ? int p=part(array,l,r);

? ? ? ? sort(array,l,p-1);

? ? ? ? sort(array,p+1,r);

? ? }

public? static? int part(Comparable[] arr,int l,int r)

{


swap( arr, l, (int)(Math.random()*(r-l+1))+l );

//防止遇到有序隊(duì)時(shí)退化成o(n2),所以隨機(jī)選擇一個(gè)數(shù)作為標(biāo)地

Comparable v = arr[l];

? ? int j = l; // arr[l+1...j] < v ; arr[j+1...i) > v

? ? for(int i = l +1 ; i <= r; i ++ )

if( arr[i].compareTo(v) <0 ){

j ++;

? ? ? ? ? ? swap(arr, j, i);

? ? ? ? }

swap(arr, l, j);

? ? return j;

}

private static void swap(Object[] arr, int i, int j) {

Object t = arr[i];

? ? ? ? arr[i] = arr[j];

? ? ? ? arr[j] = t;

? ? }

}



?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • quicksort可以說是應(yīng)用最廣泛的排序算法之一,它的基本思想是分治法,選擇一個(gè)pivot(中軸點(diǎn)),將小于pi...
    黎景陽閱讀 546評(píng)論 0 1
  • 【程序1】 題目:古典問題:有一對(duì)兔子,從出生后第3個(gè)月起每個(gè)月都生一對(duì)兔子,小兔子長(zhǎng)到第三個(gè)月后每個(gè)月又生一對(duì)兔...
    開心的鑼鼓閱讀 3,393評(píng)論 0 9
  • 【程序1】 題目:古典問題:有一對(duì)兔子,從出生后第3個(gè)月起每個(gè)月都生一對(duì)兔子,小兔子長(zhǎng)到第三個(gè)月后每個(gè)月又生一...
    阿里高級(jí)軟件架構(gòu)師閱讀 3,386評(píng)論 0 19
  • 可解決的問題:沒有足夠長(zhǎng)的時(shí)間學(xué)習(xí)/工作 吃掉青蛙四步驟:Frog(青蛙) Action(行動(dòng)清單) Suppor...
    Thinkbond閱讀 1,302評(píng)論 1 7
  • 我的記憶力很好,能清晰細(xì)致地記得每晚夢(mèng)里的一切,這些夢(mèng)像電影一樣,有著離奇?zhèn)械膭∏楹蛣?dòng)聽迷人的音樂。我把劇情記下...
    妄想先生閱讀 583評(píng)論 1 3

友情鏈接更多精彩內(nèi)容