quickSort AND mergeSort AND quickSelect

quickSort
快排在于一次把所有【大于pivot的值和小于pivot的值】都交換了润文,所以要用到while,用left和right指針控制交換的元素

public class Solution {

    public void sortIntegers2(int[] A) {
        // write your code here
        if (A == null || A.length == 0) {
            return;
        }
        quickSort(A, 0, A.length - 1);
    }
    
    private void quickSort(int[] A, int start, int end) {
        //遞歸出口 沒(méi)有這個(gè)會(huì)爆棧,因?yàn)槌霾粊?lái)了
        //注意是 >=, 其實(shí)>在quickSort里也可以因?yàn)槭莑eft++,right--是一個(gè)一個(gè)移動(dòng)的
        //而mergeSort用mid = (start + end) / 2控制,涉及了舍位
        if (start >= end) {
            return;
        }
        
        int left = start;
        int right = end;
        int pivot = A[(start + end) / 2];
        //  pivot兩邊等于也要交換,避免效率低下
        while (left <= right) {
            while (left <= right && A[left] < pivot) {
                left++;
            }
            while (left <= right && A[right] > pivot) {
                right--;
            }
            //時(shí)刻記住left <= right缺亮,而且是if條件,因?yàn)榻?jīng)過(guò)上面的while loop,兩個(gè)交錯(cuò)是很有可能
            if (left <= right) {
                int temp = A[left];
                A[left] = A[right];
                A[right] = temp;
                left++;
                right--;
            }
        }
        
        quickSort(A, start, right);
        quickSort(A, left, end);
    }
}

quickSeleck(找第K大元素)

class Solution {
    /*
     * @param k : description of k
     * @param nums : array of nums
     * @return: description of return
     */
    public int kthLargestElement(int k, int[] nums) {
        // qucik select
        if (nums == null || nums.length < k) {
            return 0;
        }
        //nums.length的話(huà)數(shù)組越界
        return quickSelect(nums, 0, nums.length - 1, k);
    }
    
    private int quickSelect(int[] nums, int start, int end, int k) {
        //出口
        if (start == end) {
            return nums[start];
        }
        
        int i = start, j = end;
        int pivot = nums[(start + end) / 2];
        //當(dāng)這個(gè)循環(huán)退出的時(shí)候一定是i > j
        while (i <= j) {
            while (i <= j && nums[i] > pivot) {
                i++;
            }
            while (i <=j && nums[j] < pivot) {
                j--;
            }
            if (i <= j) {
                int temp = nums[i];
                nums[i] = nums[j];
                nums[j] = temp;
                i++;
                j--;
            }
        }
        //這里這里桥言,從while循環(huán)出來(lái)時(shí)萌踱,j < i 了
        //.....j?i....OR .....ji.....
        //j和i中間有可能有 有可能沒(méi)有
        //這里的k - 1是帶數(shù)帶出來(lái)的假設(shè)start = j,都進(jìn)這個(gè)條件了葵礼,肯定是找這個(gè)區(qū)間第一大的數(shù),即k = 1并鸵,但是start + k = j的話(huà),左右兩邊去掉start和j得出k = 0鸳粉,與假設(shè)不符,所以說(shuō) 判斷條件是start + k - 1 <= j
        //還有一種(k - 1)的解釋方法:因?yàn)镵并不是zero-based,而start 是zero-based,所以需要k - 1; 如果k是zero-based园担,那么就是start + k <= j
        if (start + k - 1 <= j) {
            return quickSelect(nums, start, j, k);
        }
        if (start + k - 1 >= i) {
          //start     i
            //1234567|8
            //從1到8有(8 - 1 + 1 = 8)個(gè)數(shù)届谈,而8前面有8 - 1 = 7個(gè)數(shù)
            
            return quickSelect(nums, i, end, k - (i - start));
        }
        //這里屬于這種情況.....j?i....
        return nums[j + 1];
    }
};

mergeSort

public class Solution {
    /*
     * @param A: an integer array
     * @return: 
     */
    public void sortIntegers2(int[] A) {
        if (A == null || A.length == 0) {
            return;
        }
        
        int[] temp = new int[A.length];
        mergeSort(A, 0, A.length - 1, temp);
    }
    
    private void mergeSort(int[] A, int start, int end, int[] temp) {
        //遞歸出口
        //而且一定要是>=就退出, 因?yàn)橛肕iddle控制了start和end
        //mid涉及了舍位的問(wèn)題
        if (start >= end) {
            return;
        }
        //思考 為什么這里就不需要start和end賦給left和right
        int middle = (start + end) / 2;
        int right = middle + 1;
        
        mergeSort(A, start, middle, temp);
        mergeSort(A, right, end, temp);
        
        merge(A, start, end, temp);
    }
    
    private void merge(int[] A, int start, int end, int[] temp) {
        //思考 為什么這里需要start和end賦給left和right
        int left = start;
        int middle = (start + end) / 2;
        int right = middle + 1;
        //因?yàn)槭沁f歸 所以要從遞歸的角度考慮初始值
        int index = start;
        
        while (left <= middle && right <= end) {
            if (A[left] < A[right]) {
                temp[index++] = A[left++];
            } else {//這里包含了等于的情況
                temp[index++] = A[right++];
            }
        }
        while (left <= middle) {
            temp[index++] = A[left++];
        }
        while (right <= end) {
            temp[index++] = A[right++];
        }
        //因?yàn)槭沁f歸 所以要從遞歸的角度考慮賦值范圍, 這里是i <= end, start和end都要copy到temp[]里面
        for (int i = start; i <= end; i++) {
            A[i] = temp[i];
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市弯汰,隨后出現(xiàn)的幾起案子艰山,更是在濱河造成了極大的恐慌,老刑警劉巖咏闪,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件曙搬,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡汤踏,警方通過(guò)查閱死者的電腦和手機(jī)织鲸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)舔腾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)溪胶,“玉大人,你說(shuō)我怎么就攤上這事稳诚』┎保” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵扳还,是天一觀的道長(zhǎng)才避。 經(jīng)常有香客問(wèn)我,道長(zhǎng)氨距,這世上最難降的妖魔是什么桑逝? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮俏让,結(jié)果婚禮上楞遏,老公的妹妹穿的比我還像新娘。我一直安慰自己首昔,他們只是感情好寡喝,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著勒奇,像睡著了一般预鬓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赊颠,一...
    開(kāi)封第一講書(shū)人閱讀 52,196評(píng)論 1 308
  • 那天格二,我揣著相機(jī)與錄音劈彪,去河邊找鬼。 笑死蟋定,一個(gè)胖子當(dāng)著我的面吹牛粉臊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播驶兜,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼扼仲,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了抄淑?” 一聲冷哼從身側(cè)響起屠凶,我...
    開(kāi)封第一講書(shū)人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肆资,沒(méi)想到半個(gè)月后矗愧,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡郑原,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年唉韭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片犯犁。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡属愤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出酸役,到底是詐尸還是另有隱情住诸,我是刑警寧澤,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布涣澡,位于F島的核電站贱呐,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏入桂。R本人自食惡果不足惜奄薇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望抗愁。 院中可真熱鬧馁蒂,春花似錦、人聲如沸驹愚。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)逢捺。三九已至谁鳍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背倘潜。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工绷柒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人涮因。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓废睦,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親养泡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嗜湃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問(wèn)題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,747評(píng)論 0 33
  • 某次二面時(shí)澜掩,面試官問(wèn)起Js排序問(wèn)題购披,吾絞盡腦汁回答了幾種,深感算法有很大的問(wèn)題肩榕,所以總計(jì)一下刚陡! 排序算法說(shuō)明 (1...
    流浪的先知閱讀 1,194評(píng)論 0 4
  • 一、partition quicksort 分治+遞歸 快速排序一次劃分算法偽代碼: 將i和j分別指向待排序列最左...
    敲可愛(ài)的小超銀閱讀 494評(píng)論 0 0
  • 持續(xù)在追《歡樂(lè)頌》這部劇株汉,從第一部到第二部筐乳。 現(xiàn)實(shí)生活中,不一定會(huì)同時(shí)出現(xiàn)5位個(gè)性那么鮮明的閨蜜乔妈,但看她們的工作與...
    小西瓜彭彭閱讀 161評(píng)論 0 0
  • 李晨新劇《好家伙》開(kāi)播褒翰,不少人還記得他三年前發(fā)文稱(chēng)“如果誠(chéng)意之作無(wú)法與觀眾見(jiàn)面贮懈,我就卸甲歸田”匀泊,雖然今天來(lái)看范冰...
    娛樂(lè)大本營(yíng)閱讀 225評(píng)論 0 0