快速排序(Java)

快速排序算法思想:

(1)輸入的數(shù)據(jù)信息:輸入一個(gè)待排序的數(shù)組a[n]酿雪,利用QuickSort算法實(shí)現(xiàn)此數(shù)組的排序任務(wù)。

(2)快速排序的思想:找待排序數(shù)組a[n]中a[0]或者a[n-1]作為參考flag略就,例如找flag=a[n-1]近刘,然后兩個(gè)指針一個(gè)從left=0開始向右索引,一個(gè)指針從right=n-2開始向左索引干旁,left指針尋找大于flag的元素魁袜,right指針尋找小于flag的元素桩撮,如果都找不到,則left++或right--峰弹,繼續(xù)索引距境,當(dāng)left>=right時(shí),終止此循環(huán)垮卓,然后把flag與此時(shí)left指針?biāo)饕脑亟粨Q垫桂,最后輸出left,實(shí)現(xiàn)數(shù)據(jù)分割粟按,即left指針左邊的數(shù)據(jù)元素小于flag诬滩,left指針右邊的數(shù)據(jù)元素大于flag霹粥。

(3)遞歸實(shí)現(xiàn)算法:輸入待排序的數(shù)組a[n]和需要對(duì)此數(shù)組排序的索引范圍(left,right)疼鸟,因?yàn)槲覀儾豢赡塥?dú)立把數(shù)組分成兩部分后控,所以實(shí)現(xiàn)的方式就是在原數(shù)組上進(jìn)行處理,利用交換實(shí)現(xiàn)空間復(fù)雜度不變空镜。

快速排序Java編程:

public class QuickSortTest {

    public static void QuickSort(int[] arr, int left, int right){
        if(left < right){
            int medium = Partition(arr, left, right);
            QuickSort(arr, left, medium-1);
            QuickSort(arr, medium+1, right);
        }
    }

    public static int Partition(int[] arr, int left, int right){

        int pivot = arr[left];
        while (left < right) {
            while (left < right && arr[right] >= pivot)
                right--;
            if (left < right)
                arr[left++] = arr[right];
            while (left < right && arr[left] <= pivot)
                left++;
            if (left < right)
                arr[right--] = arr[left];
        }
        arr[left] = pivot;
        return left;
    }

    public static void main(String[] args) {
        int[] arr = {6,9,8,6,4,3,9,10,52,82,12,36,14};
        int left = 0;
        int right = arr.length - 1;
        QuickSort(arr,left,right);

        for(int i : arr){
            System.out.print(i);
            System.out.print(' ');
        }
    }
}

輸出結(jié)果:3 4 6 6 8 9 9 10 12 14 36 52 82 

快速排序的遞歸算法本質(zhì)上就是一個(gè)二叉樹的先序遍歷過程浩淘,先處理當(dāng)前根節(jié)點(diǎn),然后依次處理左右部分(左子樹和右子樹)吴攒。
將快速排序遞歸算法轉(zhuǎn)換為非遞歸相當(dāng)于將二叉樹先序遍歷遞歸算法轉(zhuǎn)為非遞歸算法张抄。

時(shí)間復(fù)雜度和空間復(fù)雜度計(jì)算

1.時(shí)間復(fù)雜度:

①問題描述

快速排序?qū)⒁?guī)模為n的問題分解為2個(gè)子問題,每個(gè)子問題的規(guī)模為n/2洼怔,每個(gè)子問題繼續(xù)遞歸實(shí)現(xiàn)重復(fù)操作署惯。

②公式定義:

T(n) = 2T(n/2) + f(n) = 2T(n/2) + O(n)

公式說明:T(n)表示總的時(shí)間復(fù)雜度,T(n/2)為分一次得到的子問題的時(shí)間復(fù)雜度镣隶,f(n)表示執(zhí)行一次分裂需要做多少次操作极谊,快速排序左右索引依次向中間走,總共需要遍歷n次安岂,所以f(n) = O(n)轻猖。

③求解T(n)的方法:

首先理解一個(gè)數(shù)組通過二分法對(duì)半分,一直到每一個(gè)數(shù)據(jù)都被分開隔離需要多少次域那?
答案:2^k = n咙边,所以 k = lgn (以2為底的對(duì)數(shù))

④生成函數(shù)法求解T(n)

T(n)=2T(n/2)+n
=2
[2T(n/4)+n/2]+n = 4T(n/4) + 2n
=4
[2T(n/8)+n/4]+2n = 8T(n/8) + 3n
=16T(n/16)+4n
=……
=(2^k) * T(n/(2^k)) + kn
=(2^lgn) * T(n/(2^lgn)) + n
lgn
=nT(1)+nlgn

2.空間復(fù)雜度

①問題描述

a. 借用的輔助空間的大小
b. 遞歸時(shí)壓入棧的數(shù)據(jù)所占用的空間。

②最壞情況:完全逆序


待續(xù)

[1]八大排序算法總結(jié)與java實(shí)現(xiàn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末琉雳,一起剝皮案震驚了整個(gè)濱河市样眠,隨后出現(xiàn)的幾起案子友瘤,更是在濱河造成了極大的恐慌翠肘,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辫秧,死亡現(xiàn)場離奇詭異束倍,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)盟戏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門绪妹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人柿究,你說我怎么就攤上這事邮旷。” “怎么了蝇摸?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵婶肩,是天一觀的道長办陷。 經(jīng)常有香客問我,道長律歼,這世上最難降的妖魔是什么民镜? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮险毁,結(jié)果婚禮上制圈,老公的妹妹穿的比我還像新娘。我一直安慰自己畔况,他們只是感情好鲸鹦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著问窃,像睡著了一般亥鬓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上域庇,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天嵌戈,我揣著相機(jī)與錄音,去河邊找鬼听皿。 笑死熟呛,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的尉姨。 我是一名探鬼主播庵朝,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼又厉!你這毒婦竟也來了九府?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤覆致,失蹤者是張志新(化名)和其女友劉穎侄旬,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體煌妈,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡儡羔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了璧诵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汰蜘。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖之宿,靈堂內(nèi)的尸體忽然破棺而出族操,到底是詐尸還是另有隱情,我是刑警寧澤比被,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布色难,位于F島的核電站炕婶,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏莱预。R本人自食惡果不足惜柠掂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望依沮。 院中可真熱鬧涯贞,春花似錦、人聲如沸危喉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辜限。三九已至皇拣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間薄嫡,已是汗流浹背氧急。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留毫深,地道東北人吩坝。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像哑蔫,于是被迫代替她去往敵國和親钉寝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354