算法

單鏈表快排
快排最核心的思想就是劃分,確定一個(gè)樞軸元素(pivot)恋腕,每一趟劃分的目的就是把待排序列分為兩部分,前一部分比樞軸小(序列A)荠藤,后一部分比樞軸大(序列B)。經(jīng)過一趟劃分之后序列變?yōu)椋簕A} pivot {B}吻育。以下是具體步驟:
1淤井、確定每一次劃分的樞軸元素為當(dāng)前待排序列的頭節(jié)點(diǎn)。
2游两、設(shè)置Slow和Fast兩個(gè)游標(biāo),Slow指向序列A中的最后一個(gè)元素贱案,初始化為樞軸本身(待排序列頭節(jié)點(diǎn))止吐。讓Fast遍歷一遍待排序列碍扔,當(dāng)所指元素比樞軸小時(shí),將Slow往前游一格厉膀,交換Slow和Fast所指元素的值,這樣仍能保證Slow指向的元素是序列A中的最后一個(gè)元素汰具。
3菱魔、交換Slow所指元素和樞軸元素的值。
4澜倦、對序列A和B重復(fù)步驟1~4藻治。

package leetcode.sort;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;

/**
 * 單鏈表快排
 * Created by blank on 2015-11-03 下午8:42.
 */
public class ListQuickSort {

    public static final int R = 50;

    public static void main(String[] args) throws FileNotFoundException {
        Scanner sc = new Scanner(new FileInputStream("/Users/blank/IdeaProjects/LeetCode/src/main/java/leetcode/sort/input.in"));
        int[] arr = new int[R];
        for (int i = 0; i < R; i++) {
            arr[i] = new Random().nextInt(100);
        }
        System.out.println(Arrays.toString(arr));
        ListNode head = new ListNode(0);
        ListNode p = head;
        for (int i = 0; i < arr.length; i++) {
            ListNode node = new ListNode(arr[i]);
            p.next = node;
            p = p.next;
        }
        quickSort(head.next, null);
        head = head.next;
        while (head != null) {
            System.out.print(head);
            head = head.next;
        }
    }

    public static void quickSort(ListNode head, ListNode tail) {
        if (head != tail) {
            //以各部分第一個(gè)元素為pivot元素,然后劃分左右
            ListNode pr = sort(head, tail);
            quickSort(head, pr);
            quickSort(pr.next, tail);
        }
    }

    private static ListNode sort(ListNode head, ListNode tail) {
        if (head == tail) {
            return head;
        }
        int val = head.val;
        ListNode slow = head.next;
        //用pre記錄比pivot小的最后一個(gè)元素
        ListNode pre = head;
        ListNode fast;
        while (true) {
            //slow表示比pivot元素大的元素
            while (slow != tail && slow.val < val) {
                pre = slow;
                slow = slow.next;
            }
            if (slow == tail) {
                break;
            }
            //fast表示比pivot元素小的元素
            fast = slow.next;
            while (fast != tail && fast.val > val) {
                fast = fast.next;
            }
            if (fast == tail) {
                break;
            }
            //如果存在fast在slow之后,則交換兩個(gè)元素的值
            swap(slow, fast);
            pre = slow;
            slow = slow.next;
        }
        //交換pivot和pre
        swap(head, pre);
        return pre;
    }

    private static void swap(ListNode one, ListNode two) {
        int tmp = one.val;
        one.val = two.val;
        two.val = tmp;
    }


    public static class ListNode {
        int val;
        ListNode next;

        ListNode(int x) {
            val = x;
        }

        @Override
        public String toString() {
            return val + ", ";
        }
    }

}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末验靡,一起剝皮案震驚了整個(gè)濱河市胜嗓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辞州,老刑警劉巖寥粹,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涝涤,死亡現(xiàn)場離奇詭異,居然都是意外死亡妄痪,警方通過查閱死者的電腦和手機(jī)楞件,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門土浸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人黄伊,你說我怎么就攤上這事。” “怎么了毡惜?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵经伙,是天一觀的道長勿锅。 經(jīng)常有香客問我,道長垮刹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任荒典,我火速辦了婚禮种蝶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘螃征。我一直安慰自己,他們只是感情好盯滚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布魄藕。 她就那樣靜靜地躺著撵术,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嫩与。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天饵筑,我揣著相機(jī)與錄音,去河邊找鬼根资。 笑死架专,一個(gè)胖子當(dāng)著我的面吹牛部脚,可吹牛的內(nèi)容都是我干的裤纹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼钱雷,長吁一口氣:“原來是場噩夢啊……” “哼吹零!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起套蒂,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤操刀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后婴洼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡欢唾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年礁遣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了祟霍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡沸呐,死狀恐怖垂谢,靈堂內(nèi)的尸體忽然破棺而出疮茄,到底是詐尸還是另有隱情,我是刑警寧澤力试,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站缰犁,受9級特大地震影響怖糊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜伍伤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一扰魂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧姐直,春花似錦、人聲如沸蒋畜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽佣渴。三九已至,卻和暖如春膨处,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背砂竖。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工乎澄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人置济。 一個(gè)月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像护盈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子腐宋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評論 2 355

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