導航:首頁 > 方法技巧 > 快速排序的方法與技巧

快速排序的方法與技巧

發布時間:2022-05-17 12:17:45

Ⅰ 數據結構

何謂數據結構
?
數據結構是在整個計算機科學與技術領域上廣泛被使用的術語。它用來反映一個數據的內部構成,即一個數據由那些成分數據構成,以什麼方式構成,呈什麼結構。數據結構有邏輯上的數據結構和物理上的數據結構之分。邏輯上的數據結構反映成分數據之間的邏輯關系,而物理上的數據結構反映成分數據在計算機內部的存儲安排。數據結構是數據存在的形式。 數據結構是信息的一種組織方式,其目的是為了提高演算法的效率,它通常與一組演算法的集合相對應,通過這組演算法集合可以對數據結構中的數據進行某種操作。
?
數據結構主要研究什麼?
?
數據結構作為一門學科主要研究數據的各種邏輯結構和存儲結構,以及對數據的各種操作。因此,主要有三個方面的內容:數據的邏輯結構;數據的物理存儲結構;對數據的操作(或演算法)。通常,演算法的
?
設計取決於數據的邏輯結構,演算法的實現取決於數據的物理存儲結構。
?
什麼是數據結構?什麼是邏輯結構和物理結構?
?
數據是指由有限的符號(比如,"0"和"1",具有其自己的結構、操作、和相應的語義)組成的元素的集合。結構是元素之間的關系的集合。通常來說,一個數據結構DS 可以表示為一個二元組:
?
DS=(D,S), //i.e., data-structure=(data-part,logic-structure-part) 這里D是數據元素的集合(或者是「結點」,可能還含有「數據項」或「數據域」),S是定義在D(或其他集合)上的關系的集合,S = { R | R : D×D×...},稱之為元素的邏輯結構。 邏輯結構有四種基本類型:集合結構、線性結構、樹狀結構和網路結構。表和樹是最常用的兩種高效數據結構,許多高效的演算法可以用這兩種數據結構來設計實現。表是線性結構的(全序關系),樹(偏序或層次關系)和圖(局部有序(weak/local orders))是非線性結構。
?
數據結構的物理結構是指邏輯結構的存儲鏡像(image)。數據結構 DS 的物理結構 P對應於從 DS 的數據元素到存儲區M(維護著邏輯結構S)的一個映射:
?
(PD,S) -- > M 存儲器模型:一個存儲器 M 是一系列固定大小的存儲單元,每個單元 U 有一個唯一的地址 A(U),該地址被連續地編碼。每個單元 U 有一個唯一的後繼單元 U'=succ(U)。 P 的四種基本映射模型:順序(sequential)、鏈接(linked)、索引(indexed)和散列(hashing)映射。
?
因此,我們至少可以得到4×4種可能的物理數據結構:
?
sequential (sets)
linked lists
indexed trees
hash graphs
?
(並不是所有的可能組合都合理)
?
??? 數據結構DS上的操作:所有的定義在DS上的操作在改變數據元素(節點)或節點的域時必須保持DS的邏輯和物理結構。
?
DS上的基本操作:任何其他對DS的高級操作都可以用這些基本操作來實現。最好將DS和他的所有基本操作看作一個整體——稱之為模塊。我們可以進一步將該模塊抽象為數據類型(其中DS的存儲結構被表示為私有成員,基本操作被表示為公共方法),稱之為ADT。作為ADT,堆棧和隊列都是一種特殊的表,他們擁有表的操作的子集。 對於DATs的高級操作可以被設計為(不封裝的)演算法,利用基本操作對DS進行處理。
?
好的和壞的DS:如果一個DS可以通過某種「線性規則」被轉化為線性的DS(例如線性表),則稱它為好的DS。好的DS通常對應於好的(高效的)演算法。這是由計算機的計算能力決定的,因為計算機本質上只能存取邏輯連續的內存單元,因此如何沒有線性化的結構邏輯上是不可計算的。比如對一個圖進行操作,要訪問圖的所有結點,則必須按照某種順序來依次訪問所有節點(要形成一個偏序),必須通過某種方式將圖固有的非線性結構轉化為線性結構才能對圖進行操作。
?
樹是好的DS——它有非常簡單而高效的線性化規則,因此可以利用樹設計出許多非常高效的演算法。樹的實現和使用都很簡單,但可以解決大量特殊的復雜問題,因此樹是實際編程中最重要和最有用的一種數據結構。樹的結構本質上有遞歸的性質——每一個葉節點可以被一棵子樹所替代,反之亦然。實際上,每一種遞歸的結構都可以被轉化為(或等價於)樹形結構。
?

從機器語言到高級語言的抽象
?
我們知道,演算法被定義為一個運算序列。這個運算序列中的所有運算定義在一類特定的數據模型上,並以解決一類特定問題為目標。這個運算序列應該具備下列四個特徵。 有限性,即序列的項數有限,且每一運算項都可在有限的時間內完成;確定性,即序列的每一項運算都有明確的定義,無二義性;可以沒有輸入運算項,但一定要有輸出運算項;可行性,即對於任意給定的合法的輸入都能得到相應的正確的輸出。這些特徵可以用來判別一個確定的運算序列是否稱得上是一個演算法。 但是,我們現在的問題不是要判別一個確定的運算序列是否稱得上是一個演算法,而是要對一個己經稱得上是演算法的運算序列,回顧我們曾經如何用程序設計語言去表達它。
?
演算法的程序表達,歸根到底是演算法要素的程序表達,因為一旦演算法的每一項要素都用程序清楚地表達,整個演算法的程序表達也就不成問題。
?
作為運算序列的演算法,有三個要素。 作為運算序列中各種運算的運算對象和運算結果的數據;運算序列中的各種運算;運算序列中的控制轉移。這三種要素依序分別簡稱為數據、運算和控制。 由於演算法層出不窮,變化萬千,其中的運算所作用的對象數據和所得到的結果數據名目繁多,不勝枚舉。最簡單最基本的有布爾值數據、字元數據、整數和實數數據等;稍復雜的有向量、矩陣、記錄等數據;更復雜的有集合、樹和圖,還有聲音、圖形、圖像等數據。 同樣由於演算法層出不窮,變化萬千,其中運算的種類五花八門、多姿多彩。最基本最初等的有賦值運算、算術運算、邏輯運算和關系運算等;稍復雜的有算術表達式和邏輯表達式等;更復雜的有函數值計算、向量運算、矩陣運算、集合運算,以及表、棧、隊列、樹和圖上的運算等:此外,還可能有以上列舉的運算的復合和嵌套。 關於控制轉移,相對單純。在串列計算中,它只有順序、分支、循環、遞歸和無條件轉移等幾種。
?
我們來回顧一下,自從計算機問世以來,演算法的上述三要素的程序表達,經歷過一個怎樣的過程。
?
最早的程序設計語言是機器語言,即具體的計算機上的一個指令集。當時,要在計算機上運行的所有演算法都必須直接用機器語言來表達,計算機才能接受。演算法的運算序列包括運算對象和運算結果都必須轉換為指令序列。其中的每一條指令都以編碼(指令碼和地址碼)的形式出現。與演算法語言表達的演算法,相差十萬八千里。對於沒受過程序設計專門訓練的人來說,一份程序恰似一份"天書",讓人看了不知所雲,可讀性
?
極差。
?
用機器語言表達演算法的運算、數據和控制十分繁雜瑣碎,因為機器語言所提供的指令太初等、原始。機器語言只接受算術運算、按位邏輯運算和數的大小比較運算等。對於稍復雜的運算,都必須一一分解,直到到達最初等的運算才能用相應的指令替代之。機器語言能直接表達的數據只有最原始的位、位元組、和字三種。演算法中即使是最簡單的數據如布爾值、字元、整數、和實數,也必須一一地映射到位、位元組和字
中,還得一一分配它們的存儲單元。對於演算法中有結構的數據的表達則要麻煩得多。機器語言所提供的控制轉移指令也只有無條件轉移、條件轉移、進入子程序和從子程序返回等最基本的幾種。用它們來構造循環、形成分支、調用函數和過程得事先做許多的准備,還得靠許多的技巧。 直接用機器語言表達演算法有許多缺點。
?

大量繁雜瑣碎的細節牽制著程序員,使他們不可能有更多的時間和精力去從事創造性的勞動,執行對他們來說更為重要的任務。如確保程序的正確性、高效性。程序員既要駕馭程序設計的全局又要深入每一個局部直到實現的細節,即使智力超群的程序員也常常會顧此失彼,屢出差錯,因而所編出的程序可靠性差,且開發周期長。 由於用機器語言進行程序設計的思維和表達方式與人們的習慣大相徑庭,只有經過
較長時間職業訓練的程序員才能勝任,使得程序設計曲高和寡。因為它的書面形式全是"密"碼,所以可讀性差,不便於交流與合作。因為它嚴重地依賴於具體的計算機,所以可移植性差,重用性差。這些弊端造成當時的計算機應用未能迅速得到推廣。
?
克服上述缺點的出路在於程序設計語言的抽象,讓它盡可能地接近於演算法語言。 為此,人們首先注意到的是可讀性和可移植性,因為它們相對地容易通過抽象而得到改善。於是,很快就出現匯編語言。這種語言對機器語言的抽象,首先表現在將機器語言的每一條指令符號化:指令碼代之以記憶符號,地址碼代之以符號地址,使得其含義顯現在符號上而不再隱藏在編碼中,可讓人望"文"生義。其次表現在這種語言擺脫了具體計算機的限制,可在不同指令集的計算機上運行,只要該計算機配上匯編語言的一個匯編程序。這無疑是機器語言朝演算法語言靠攏邁出的一步。但是,它離演算法語言還太遠,以致程序員還不能從分解演算法的數據、運算和控制到匯編才能直接表達的指令等繁雜瑣碎的事務中解脫出來。 到了50年代中期,出現程序設計的高級語言如Fortran,Algol60,以及後來的PL/l, Pascal等,演算法的程序表達才產生一次大的飛躍。
?
誠然,演算法最終要表達為具體計算機上的機器語言才能在該計算機上運行,得到所需要的結果。但匯編語言的實踐啟發人們,表達成機器語言不必一步到位,可以分兩步走或者可以築橋過河。即先表達成一種中介語言,然後轉成機器語言。匯編語言作為一種中介語言,並沒有獲得很大成功,原因是它離演算法語
?
言還太遠。這便指引人們去設計一種盡量接近演算法語言的規范語言,即所謂的高級語言,讓程序員可以用它方便地表達演算法,然後藉助於規范的高級語言到規范的機器語言的"翻譯",最終將演算法表達為機器語言。而且,由於高級語言和機器語言都具有規范性,這里的"翻譯"完全可以機械化地由計算機來完成,就像匯編語言被翻譯成機器語言一樣,只要計算機配上一個編譯程序。 上述兩步,前一步由程序員去完成,後一步可以由編譯程序去完成。在規定清楚它們各自該做什麼之後,這兩步是完全獨立的。它們各自該如何做互不相干。前一步要做的只是用高級語言正確地表達給定的演算法,產生一個高級語言程序;後一步要做的只是將第一步得到的高級語言程序翻譯成機器語言程序。至於程序員如何用高級語言表達演算法和編譯程序如何將高級語言表達的演算法翻譯成機器語言表達的演算法,顯然毫不相干。
?
處理從演算法語言最終表達成機器語言這一復雜過程的上述思想方法就是一種抽象。匯編語言和高級語言的出現都是這種抽象的範例。 與匯編語言相比,高級語言的巨大成功在於它在數據、運算和控制三方
?
面的表達中引入許多接近演算法語言的概念和工具,大大地提高抽象地表達演算法的能力。 在運算方面,高級語言如Pascal,除允許原封不動地運用演算法語言的四則運算、邏輯運算、關系運算、算術表達式、邏輯表達式外,還引入強有力的函數與過程的工具,並讓用戶自定義。這一工具的重要性不僅在於它精簡了重復的程序文本段,而且在於它反映出程序的兩級抽象。
?
在函數與過程調用級,人們只關心它能做什麼,不必關心它如何做。只是到函數與過程的定義時,人們才給出如何做的細節。用過高級語言的讀者都知道,一旦函數與過程的名稱、參數和功能被規定清楚,那麼,在程序中調用它們便與在程序的頭部說明它們完全分開。你可以修改甚至更換函數體與過程體,而不影響它們的被調用。如果把函數與過程名看成是運算名,把參數看成是運算的對象或運算的結果,那麼
?
,函數與過程的調用和初等運算的引用沒有兩樣。利用函數和過程以及它們的復合或嵌套可以很自然地表達演算法語言中任何復雜的運算。
?
在數據方面,高級語言如Pascal引人了數據類型的概念,即把所有的數據加以分類。每一個數據(包括表達式)或每一個數據變數都屬於其中確定的一類。稱這一類數據為一個數據類型。 因此,數據類型是數據或數據變數類屬的說明,它指示該數據或數據變數可能取的值的全體。對於無結構的數據,高級語言如Pascal,除提供標準的基本數據類型--布爾型、字元型、整型和實型外,還提供用戶可自定義的枚舉類、子界類型和指針類型。這些類型(除指針外),其使用方式都順應人們在演算法語言中使用的習慣。對於有結構的數據,高級語言如Pascal,提供了數組、記錄、有限制的集合和文件等四種標準的結構數據類型。其中,數組是科學計算中的向量、矩陣的抽象;記錄是商業和管理中的記錄的抽象;有限制的集合是數學中足夠小的集合的勢集的抽象;文件是諸如磁碟等外存儲數據的抽象。
?
人們可以利用所提供的基本數據類型(包括標準的和自定義的),按數組、記錄、有限制的集合和文件的構造規則構造有結構的數據。 此外,還允許用戶利用標準的結構數據類型,通過復合或嵌套構造更復雜更高層的結構數據。這使得高級語言中的數據類型呈明顯的分層。 高級語言中數據類型的分層是沒有窮盡的,因而用它們可以表達演算法語言中任何復雜層次的數據。 在控制方面,高級語言如Pascal,提供了表達演算法控制轉移的六種方式。
?
(1)預設的順序控制";"。
?
(2)條件(分支)控制:"if表達式(為真)then S1 else S2;" 。
?
(3)選擇(情況)控制:
?
"Case 表達式 of
?
值1: S1
值2: S2
...
值n: Sn
end"
?
(4)循環控制:
?
"while 表達式(為真) do S;" 或
"repeat S until 表達式(為真);" 或
"for變數名:=初值 to/downto 終值do S;"
?
(5)函數和過程的調用,包括遞歸函數和遞歸過程的調用。
?
(6)無條件轉移goto。

這六種表達方式不僅覆蓋了演算法語言中所有控製表達的要求,而且不再像機器語言或匯編語言那樣原始、那樣繁瑣、那樣隱晦,而是如上面所看到的,與自然語言的表達相差無幾。 程序設計語言從機器語言到高級語言的抽象,帶來的主要好處是: 高級語言接近演算法語言,易學、易掌握,一般工程技術人員只要幾周時間的培訓就可以勝任程序員的工作;高級語言為程序員提供了結構化程序設計的環境和工具,使得設計出來的程序可讀性好,可維護性強,可靠性高;高級語言遠離機器語言,與具體的計算機硬體關系不大,因而所寫出來的程序可移植性好,重用率高; 由於把繁雜瑣碎的事務交給了編譯程序去做,所以自動化程度高,開發周期短,且程、序員得到解脫,可以集中時間和精力去從事對於他們來說更為重要的創造性勞動,以提高、程序的質量。
?
數據結構、數據類型和抽象數據類型
?
數據結構、數據類型和抽象數據類型,這三個術語在字面上既不同又相近,反映出它們在含義上既有區別又有聯系。
?
數據結構是在整個計算機科學與技術領域上廣泛被使用的術語。它用來反映一個數據的內部構成,即一個數據由哪些成分數據構成,以什麼方式構成,呈什麼結構。數據結構有邏輯上的數據結構和物理上的數據結構之分。邏輯上的數據結構反映成分數據之間的邏輯關系,物理上的數據結構反映成分數據在計算機內的存儲安排。數據結構是數據存在的形式。
?
數據是按照數據結構分類的,具有相同數據結構的數據屬同一類。同一類數據的全體稱為一個數據類型。在程序設計高級語言中,數據類型用來說明一個數據在數據分類中的歸屬。它是數據的一種屬性。這個屬性限定了該數據的變化范圍。為了解題的需要,根據數據結構的種類,高級語言定義了一系列的數據類型。不同的高級語言所定義的數據類型不盡相同。Pascal語言所定義的數據類型的種類。
?
其中,簡單數據類型對應於簡單的數據結構;構造數據類型對應於復雜的數據結構;在復雜的數據結構里,允許成分數據本身具有復雜的數據結構,因而,構造數據類型允許復合嵌套;指針類型對應於數據結構中成分數據之間的關系,表面上屬簡單數據類型,實際上都指向復雜的成分數據即構造數據類型中的數據,因此這里沒有把它劃入簡單數據類型,也沒有劃入構造數據類型,而單獨劃出一類。
?
數據結構反映數據內部的構成方式,它常常用一個結構圖來描述:數據中的每一項成分數據被看作一個結點,並用方框或圓圈表示,成分數據之間的關系用相應的結點之間帶箭號的連線表示。如果成分數據本身又有它自身的結構,則結構出現嵌套。這里嵌套還允許是遞歸的嵌套。
?
由於指針數據的引入,使構造各種復雜的數據結構成為可能。按數據結構中的成分數據之間的關系,數據結構有線性與非線性之分。在非線性數據結構中又有層次與網狀之分。 由於數據類型是按照數據結構劃分的,因此,一類數據結構對應著一種數據類型。數據類型按照該類型中的數據所呈現的結構也有線性與非線性之分,層次與網狀之分。一個數據變數,在高級語言中的類型說明必須是讀變數所具有的數據結構所對應的數據類型。最常用的數據結構是數組結構和記錄結構。數組結構的特點是:
?
成分數據的個數固定,它們之間的邏輯關系由成分數據的序號(或叫數組的下標)來體現。這些成分數據按照序號的先後順序一個挨一個地排列起來。每一個成分數據具有相同的結構(可以是簡單結構,也可以是復雜結構),因而屬於同一個數據類型(相應地是簡單數據類型或構造數據類型)。這種同一的數據類型稱為基類型。所有的成分數據被依序安排在一片連續的存儲單元中。 概括起來,數組結構是一個線性的、均勻的、其成分數據可隨機訪問的結構。
?
由於這、種結構有這些良好的特性,所以最常被人們所採用。在高級語言中,與數組結構相對應的、數據類型是數組類型,即數組結構的數據變數必須說明為array [i] of T0 ,其中i是數組、結構的下標類型,而T0是數組結構的基類型。 記錄結構是另一種常用的數據結構。它的特點是:與數組結構一樣,成分數據的個數固定。但成分數據之間沒有自然序,它們處於平等地位。每一個成分數據被稱為一個域並賦予域名。不同的域有不同的域名。不同的域允許有不同的結構,因而允許屬於不同的數據類型。與數組結構一樣,它們可以隨機訪問,但訪問的途徑靠的是域名。在高級語言中記錄結構對應的數據類型是記錄類型。記錄結構的數據的變數必須說明為記錄類型。
?
抽象數據類型的含義在上一段已作了專門敘述。它可理解為數據類型的進一步抽象。即把數據類型和數據類型上的運算捆在一起,進行封裝。引入抽象數據類型的目的是把數據類型的表示和數據類型上運算的實現與這些數據類型和運算在程序中的引用隔開,使它們相互獨立。對於抽象數據類型的描述,除了必須描述它的數據結構外,還必須描述定義在它上面的運算(過程或函數)。抽象數據類型上定義的過程和函
數以該抽象數據類型的數據所應具有的數據結構為基礎。
?
泛型設計和數據結構與演算法
?
下面我想再說說關於泛型程序設計模型對於數據結構和演算法方面的最新推動,泛型思想已經把數據結
?
構和演算法方面的基本思想抽象到了一個前所未有的高度,現在有多種程序設計語言支持泛型設計,比如
ADA,C++,而且據說在JAVA的下一版本和C#中也將對泛型設計進行全面的支持。
?
先說說泛型設計的基本思想:泛型編程(generic programming,以下直接以GP稱呼)是一種全新的程序設計思想,和OO,OB,PO這些為人所熟知的程序設計想法不同的是GP抽象度更高,基於GP設計的組件之間偶合度底,沒有繼承關系,所以其組件間的互交性和擴展性都非常高。我們都知道,任何演算法都是作用在一種特定的數據結構上的,最簡單的例子就是快速排序演算法最根本的實現條件就是所排序的對象是存
貯在數組裡面,因為快速排序就是因為要用到數組的隨機存儲特性,即可以在單位時間內交換遠距離的對象,而不只是相臨的兩個對象,而如果用聯表去存儲對象,由於在聯表中取得對象的時間是線性的既O[n],這樣將使快速排序失去其快速的特點。也就是說,我們在設計一種演算法的時候,我們總是先要考慮其應用的數據結構,比如數組查找,聯表查找,樹查找,圖查找其核心都是查找,但因為作用的數據結構不同
?
將有多種不同的表現形式。數據結構和演算法之間這樣密切的關系一直是我們以前的認識。泛型設計的根本思想就是想把演算法和其作用的數據結構分離,也就是說,我們設計演算法的時候並不去考慮我們設計的演算法將作用於何種數據結構之上。泛型設計的理想狀態是一個查找演算法將可以作用於數組,聯表,樹,圖等各種數據結構之上,變成一個通用的,泛型的演算法。這樣的理想是不是很誘惑人?
?
泛型編程帶來的是前所未有的彈性以及不會損失效率的抽象性,GP和OO不同,它不要求你通過額外的間接層來調用函數:它讓你撰寫完全一般化並可重復使用的演算法,其效率與針對特定數據結構而設計的演算法旗鼓相當。我們大家都知道數據結構在C++中可以用用戶定義類型來表示,而C++中的模板技術就是以類型作為參數,那麼我可以想像利用模板技術可以實現我們開始的GP思想,即一個模板函數可以對於各種傳遞進來的類型起作用,而這些類型就可以是我們定義的各種數據結構。
?
泛型演算法抽離於特定類型和特定數據結構之外,使得其適應與盡可能的一般化類型,演算法本身只是為了實現演算法其需要表達的邏輯本質而不去被為各種數據結構的實現細節所干擾。這意味著一個泛型演算法實際具有兩部分。1,用來描敘演算法本質邏輯的實際指令;2,正確指定其參數類型必須滿足的性質的一組需求條件。到此,相信有不少人已經開始糊塗了,呵呵,不要緊。畢竟GP是一種抽象度非常高的程序設計思想,裡面的核心就是抽象條件成為成為程序設計過程中的核心,從而取代了類型這在OO裡面的核心地位,正是因為類型不在是我們考慮的重點,類型成為了抽象條件的外衣,所以我們稱這樣的程序思想為泛型思想------把類型泛化。
這樣可以么?

Ⅱ 那位大大能詳細的講解一下JAVA中的快速排序

快速排序是對冒泡排序的一種改進。它的基本思想是:通過一躺排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按次方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。最壞情況的時間復雜度為O(n2),最好情況時間復雜度為O(nlog2n)。

另外 java沒指針概念 可以認為是句柄
假設要排序的數組是A[1]……A[N],首先任意選取一個數據(通常選用第一個數據)作為關鍵數據,然後將所有比它的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一躺快速排序。一趟快速排序的演算法是:

1)、設置兩個變數I、J,排序開始的時候I:=1,J:=N;

2)以第一個數組元素作為關鍵數據,賦值給X,即X:=A[1];

3)、從J開始向前搜索,即由後開始向前搜索(J:=J-1),找到第一個小於X的值,兩者交換;

4)、從I開始向後搜索,即由前開始向後搜索(I:=I+1),找到第一個大於X的值,兩者交換;

5)、重復第3、4步,直到I=J;

例如:待排序的數組A的值分別是:(初始關鍵數據X:=49)

A[1] A[2] A[3] A[4] A[5] A[6] A[7]:

49 38 65 97 76 13 27

進行第一次交換後: 27 38 65 97 76 13 49

( 按照演算法的第三步從後面開始找)

進行第二次交換後: 27 38 49 97 76 13 65

( 按照演算法的第四步從前面開始找>X的值,65>49,兩者交換,此時I:=3 )

進行第三次交換後: 27 38 13 97 76 49 65

( 按照演算法的第五步將又一次執行演算法的第三步從後開始找)

進行第四次交換後: 27 38 13 49 76 97 65

( 按照演算法的第四步從前面開始找大於X的值,97>49,兩者交換,此時J:=4 )

此時再執行第三步的時候就發現I=J,從而結束一躺快速排序,那麼經過一躺快速排序之後的結果是:27 38 13 49 76 97 65,即所以大於49的數全部在49的後面,所以小於49的數全部在49的前面。

快速排序就是遞歸調用此過程——在以49為中點分割這個數據序列,分別對前面一部分和後面一部分進行類似的快速排序,從而完成全部數據序列的快速排序,最後把此數據序列變成一個有序的序列,根據這種思想對於上述數組A的快速排序的全過程如圖6所示:

初始狀態 {49 38 65 97 76 13 27}

進行一次快速排序之後劃分為 {27 38 13} 49 {76 97 65}

分別對前後兩部分進行快速排序 {13} 27 {38}

結束 結束 {49 65} 76 {97}

49 {65} 結束

結束//下面是一個示例,哪位給說說快速排序法的原理,下面的示例中指針和上下標移動我看不太懂,
public class QuickSort {
/**主方法*/
public static void main(String[] args) {
//聲明數組
int[] nums = {27, 8, 57, 9, 23, 41, 65, 19, 0, 1, 2, 4, 5};
//應用快速排序方法
quickSort(nums, 0, nums.length-1);
//顯示排序後的數組
for(int i = 0; i < nums.length; ++i) {
System.out.print(nums[i] + ",");
}
System.out.println("");
}

/**快速排序方法*/
public static void quickSort(int[] a, int lo0, int hi0) {
int lo = lo0;
int hi = hi0;

if (lo >= hi)
return;

//確定指針方向的邏輯變數
boolean transfer=true;

while (lo != hi) {
if (a[lo] > a[hi]) {
//交換數字
int temp = a[lo];
a[lo] = a[hi];
a[hi] = temp;
//決定下標移動,還是上標移動
transfer = (transfer == true) ? false : true;
}

//將指針向前或者向後移動
if(transfer)
hi--;
else
lo++;

//顯示每一次指針移動的數組數字的變化
/*for(int i = 0; i < a.length; ++i) {
System.out.print(a[i] + ",");
}
System.out.print(" (lo,hi) = " + "(" + lo + "," + hi + ")");
System.out.println("");*/
}

//將數組分開兩半,確定每個數字的正確位置
lo--;
hi++;
quickSort(a, lo0, lo);
quickSort(a, hi, hi0);
}
}

Ⅲ excel快速排序技巧,如何使用SORTBY函數對數據進行排序

SORTBY 函數基於相應范圍或數組中的值對范圍或數組的內容進行排序。

Ⅳ 壓縮文件

詳細看第14

作為壓縮軟體中的佼佼者WinZip日前已推出了全新的WinZip 7.0版本,其主要功能包括:(1)與Windows 95/98/NT高度整合。WinZip支持長文件名並與Windows 95/98/NT shell緊密整合,可直接從/向資源管理器中拖出/入,無需離開資源管理器即可完成文件的壓縮與解壓縮。(2)支持Internet。WinZip內建支持最流行的Internet文件格式,如TAR、gzip、Unix compress、UUEncode、Xxencode、BinHex和MIME,安裝相應的外部程序後,WinZip也可以支持ARJ、LZH和ARC壓縮文件,總之,使用WinZip您幾乎可以訪問所有的從Internet下載的文件格式。另外,其可免費下載的WinZip Internet Browser Support Add-On,讓您在Microsoft Internet Explorer或Netscape Navigator中只需單擊就能夠下載並打開壓縮文件。(3)內建壓縮和解壓縮。WinZip內建與PKZIP完全兼容的ZIP和UNZIP,並支持多磁碟Zip壓縮文件。(4)自動安裝Zip文件中的大多數軟體。如果一個Zip文件包括一個Setup或Install程序,WinZip的Install功能將解壓縮該文件,運行安裝程序並最後清除臨時文件。(5)WinZip向導(WinZip Wizard)。該功能使用標準的、為大家所熟悉的用戶界面處理解壓縮和Zip文件內部的安裝軟體。它不是為有經驗的用戶而設置,但卻是那些數以萬計的Computer Fan快速掌握WinZip,以進行壓縮和解壓縮操作所不可或缺的東西。(6)Favorite Zip Folders功能。WinZip能夠將所有的Zip文件都列入該窗口,在這里您能夠按照日期進行排序,使得定位所有Zip文件變得非常簡單,而不管它們來自哪裡或保存在什麼地方。與普通的File->Open Archive對話框不同,Favorite Zip Folders 對話框將多個文件夾視為一個目錄就好像他們是一個文件夾一樣。一個搜索工具會發現丟失在您硬碟上的所有Zip文件。(7)建立自解壓文件。WinZip Self-Extractor Personal Edition包含於WinZip之中,當你將某個文件發送給那些您知道或不知道其使用何種壓縮軟體的人時,自解壓文件(Self-extracting file)無疑是一個非常不壞的主意。(8)多卷壓縮。利用WinZip可將一個或若干大的文件壓縮至若干可移動磁碟之中,如果需要,可將該多卷壓縮文件製作為自解壓文件形式。(9)病毒掃描。WinZip能夠設置並運行絕大多數的病毒掃描程序,用以在壓縮或解壓縮之前對文件進行安全性檢查。下面我們為大家詳細介紹一下該軟體的使用方法和技巧。

1.快速壓縮與解壓縮。

(1)若欲快速壓縮或解壓縮文件,只需在資源管理器中以滑鼠右擊該文件(使用Shift和Ctrl鍵可以選中若干文件),並在彈出的快捷菜單中選擇「Add to Zip」或「Extract To」命令即可。若選中「Add to xxxxx.Zip」(只壓縮一個文件時有效)或「Extract to folder xxxxxxx」,則可直接將文件壓縮/解壓縮至WinZip默認的文件/目錄中。

(2)從Zip壓縮文件中解壓縮所有的文件。在資源管理器窗口中,使用滑鼠右鍵將欲解壓縮文件從一個資源管理器窗口拖放至任意文件夾,然後在彈出的快捷菜單中選中「Extract To」命令即可。注意:必須使用滑鼠右鍵拖拽欲解壓文件,若以滑鼠左鍵拖放則同盤間是移動,異盤間是復制,而不是解壓縮。

(3)從Zip壓縮文件中解壓縮若干文件。在資源管理器窗口中雙擊欲解壓縮的文件彈出WinZip窗口,選中欲解壓縮的文件,右擊滑鼠並在彈出的快捷菜單中選中「Extract To」命令即可。

2.將若干文件添加至壓縮文件中。在資源管理器窗口文件欄中,使用滑鼠左鍵或右鍵將欲添加文件(包括壓縮文件)拖放至目標壓縮文件即可。

3.從壓縮包中刪除文件。在WinZip主窗口中打開欲進行編輯的壓縮包,右擊欲刪除的文件(可同時選中多個文件),然後在彈出的快捷菜單中選中Delete命令即可。

4.製作自解壓文件。如果您欲將一個壓縮文件發送給某人,而您並不能確定他是否安裝有解壓縮軟體,那麼您應當將其製作為自解壓文件。WinZip內置的Zip Self-Extractor Personal Edition程序,可方便地實現該操作。首先,將該文件製作為壓縮文件,然後在資源管理器中右擊該文件或者在WinZip中打開該文件並右擊其中任一文件,然後在彈出的快捷菜單中選中Make .Exe File命令即可。

5.建立多卷壓縮文件。

(1)建立單文件多卷壓縮文件。資源管理器中以滑鼠右擊欲壓縮文件,並在彈出的快捷菜單中選擇「Add to Zip」命令,在彈出的Add對話框「Add to Archive」框中鍵入一可移動磁碟的盤符,WinZip將首先對文件進行壓縮,然後將壓縮後的文件寫到磁碟中,第一張磁碟寫滿後,根據提示再插入下一張磁碟即可。

(2)建立多文件多卷壓縮文件。在一張可移動的磁碟上建立一個Zip壓縮文件,然後將您中意的文件添加到該壓縮文件,當磁碟寫滿以後,根據提示再插入下一張磁碟即可。

6.製作多卷自解壓文件。WinZip內建的WinZip Self-Extractor Personal Edition可將大型文件製作為自解壓文件並將其放置於多張可移動磁碟中。一種較為簡單地啟動WinZip Self-Extractor Personal Edition的方法是:先利用WinZip建立一個普通的Zip文件,然後再在工具欄中單擊Make.Exe快捷圖標或從Actions菜單中選中Make .Exe File圖標後,該程序即可被激活,除非你在Options\Configuration\Program Locations對話框「Program to create self-extracting Zip files Make EXE」框中指定了其他自解壓文件製作程序。如果在安裝WinZip時您選擇了建立WinZip Self-Extractor Personal Edition圖標,那麼也可以雙擊該圖標以開始該程序。

自解壓文件製作時可採用三種不同的模式,一是No Spanning,該模式將不在磁碟中建立a.exe文件,因此也不能跨磁碟操作。二是Safe spanning method,該模式下WinZip Self-Extractor同時將兩個文件放置在第一張磁碟,即包括第一部分壓縮數據的a .ZIP文件和包含提取數據包必須的執行代碼的small .EXE文件,第二張及其後的磁碟內則容納包含其它壓縮數據的.ZIP文件。三是Old spanning method,老式的多卷壓縮方法將包含用於提取壓縮數據的執行代碼和第一部分數據的a .EXE放置在第一張磁碟之中,第二張及其後的磁碟容納剩餘的數據,在這些文件之中(甚至事實上它們並不包含任何可執行代碼)都包含有一個.exe的可執行文件。這可能非常危險,因為如果用戶不小心而運行了第二或其後磁碟上的EXE文件,將出現不可預見的錯誤信息,甚至會導致系統掛起。因此,如果您欲製作安全的多卷自解壓文件,最好採取Safe spanning method方式。

WinZip Self-Extractor製作的多卷自解壓文件,在解壓縮時非常簡單,插入第一張磁碟並雙擊EXE文件,然後只需根據提示插入相應的磁碟即可。

7.壓縮包注釋。在Actions菜單中單擊Comment命令,彈出Comment編輯窗口,在此可顯示、建立、編輯、刪除有關該壓縮包的描述性文本信息,Windows下復制(Ctrl+C)、粘貼(Ctrl+V)和剪切(Ctrl+X)等快捷鍵完全適用於該編輯窗口。

8.軟體安裝。對於包含有Install或Setup安裝文件的壓縮包,WinZip無需執行解壓縮過程,即可完成軟體的安裝。單擊「Open」快捷圖標或者在「File」菜單中選中「Open Archive」命令,打開欲進行安裝的包含有Install或Setup程序的壓縮包,然後單擊工具欄中的「Install」快捷圖標或在「Actions」菜單中選中「Install」命令,彈出「Install」對話框。如果Install按鈕沒有顯示在工具欄中,但是您能夠確認該文件是一個安裝文件,那麼,可以使用CheckOut功能來嘗試在壓縮文件包中直接安裝該軟體。在WinZip主頁http://www.winzip.com處您可以找到並下載以前發布的Install/Try/Uninstall Windows 95/98/NT版本,它能夠同WinZip的Install功能一起建立安裝程序的反安裝程序。WinZip獨一無二的Install/Try/Uninstall功能,通過保存應用程序在安裝過程時系統內部所作的一切改變,而讓您在從壓縮包內部直接安裝和刪除安裝軟體時變得非常簡單。在反安裝時,您能夠選擇刪除安裝程序形成的文件、圖標或程序組,並且能夠恢復任何已經改變了的INI文件,總之您能夠完全控制反安裝的全過程,並將系統完全恢復到其原始狀態。

9.從Microsoft's CAB (cabinet)格式壓縮包(包括大多數自解壓CAB文件)中提取文件。打開Microsoft CAB壓縮包格式文件,就像打開一個普通的壓縮文件包一樣簡單,在WinZip中打開並瀏覽CAB壓縮包內的所有文件,選中需要的一個、幾個或全部文件,單擊Extract按鈕或右擊滑鼠並在彈出的快捷菜單中選中Extract to命令即可。除Zip、CAB格式之外,WinZip還能夠處理許多種壓縮文件格式,如TAR、Z、GZ、TGZ、Uuencode、BinHex和MIME等。

10.快速排序。WinZip在主窗口的文件列表中採用了欄目按鈕,該按鈕類似於Windows 95OSR2/98資源管理器右欄文件列表中的欄目按鈕,並具有與其基本相同的功能和特點,其一,單擊任一欄目按鈕即可以此為標准對選中的文件進行排序,再次單擊該欄目按鈕時,再以反向排序;其二,欄目按鈕的寬度可用滑鼠隨意左右拖動,用以顯示因空間不夠而隱藏起來的部分信息;其三,欄目按鈕可通過拖曳以改變其相對位置。在Options\Configuration\View對話框中可任意選擇欲顯示/關閉的欄目按鈕(Name欄除外),它們分別是Name(主文件名+擴展名)、Type(文件類型)、Modified(修改時間)、Size(壓縮前文件大小)、Ratio(壓縮率)、Packed(壓縮後文件大小)、CRC(循環冗餘碼校驗)、Attributes(文件屬性)和Path(路徑)。在View對話框中單擊Defaults按鈕,可將欄目按鈕恢復為Winzip默認的狀態。

11.快速查找Zip文件。如果你記不得將自己的Zip 文件放在了何處,可以用Favorite Zip Folders功能來進行查找,只需在WinZip的File菜單中單擊Favorite Zip Folders命令,則所有Zip文件將立即盡收眼底。

12.快速瀏覽修改應用文檔。將WinZip窗口文件列表中的Zip文件拖曳到其應用程序或應用程序的快捷方式,即可打開查看該文件並進行編輯和修改。

13.快速查看。Quick View(快速查看)是Windows中一個非常有用的小工具,利用它不必調用原應用程序就可以直接瀏覽文件內容。如果您在安裝Windows時選擇了該組件,那麼您在WinZip中也可以使用它來快速查看文檔。如果您是在安裝WinZip之後才又添加安裝了Quick View,則必須在Options\Configuration\Program Locations選項卡的Viewer框中鍵入Quick View所在的文件夾及其和文件名,才可實現快速查看。

14.E-mail Zip文件。如果你使用的是與MAPI兼容的E-mail系統,則簡單地利用WinZip File菜單中的Mail Archive命令,或者單擊WinZip狀態行,然後將其拖放至電子郵件程序。

15.以命令行方式批操作。命令行的方式可通過wzzip.exe和wzunzip.exe實現文件的壓縮和解壓縮。當有特殊的工作需要或者欲將工作完成的更快、自動化程度更高,使用普通的WinZip圖形界面不能滿足需要時,WinZip命令行界面可以讓您使用其內置的強力批處理和宏來實現這一願望。

16.列印在WinZip主窗口中的可見的壓縮文件的信息。若欲改變列印的內容,唯一的方法就是必須更改顯示在窗口的內容,或者通過拖曳的方式改變欄寬,或者在Options\Configuration\View 中改變顯示的欄目。

17.快速列印文件。將WinZip窗口文件列表中的Zip文件拖曳到列印機或其快捷方式即可實現文件的列印。注意:在File菜單中選中Print命令並非是列印文件內容,而是列印WinZip文件列表中顯示的內容。

18.快速打開最近訪問的Zip文件。用WinZip 打開的Zip 文件會添加到「開始」按鈕的「文檔」列表中,因此,若欲訪問最近打開的文檔可直接在該處完成。

19.調用其它壓縮軟體。由於不同壓縮程序製作的壓縮文檔格式不同,所以當您使用非ZIP格式文件時,則需要另外安裝其它壓縮軟體。客觀地講,其它壓縮軟體總不如WinZip簡單易用,因此,您可以讓WinZip來調用其它壓縮程序實現文件的解壓縮。目前,WinZip支持的壓縮軟體為ARJ、LHA和ARC,如果您安裝有該軟體,應當在Options\Configuration\Program Locations選項卡中分別指明其所在的文件夾和程序文件名。

20.病毒掃描。在WinZip中打開欲掃描病毒的壓縮文件,右擊選中的欲掃描的若干文件,在彈出的快捷菜單中選中「Virus Scan」命令,WinZip即可使用在Options\Configuration\Program Locations選項卡Optional virus scanner Scan Program框中指定的查殺病毒程序直接病毒的掃描。

21.中止WinZip操作。在WinZip對文件進行操作時(打開、壓縮、解壓縮、製作自解壓文件等),單擊WinZip窗口中的任意位置,都可中止目前所作的操作,並彈出「Archive Operation Interrupted」提示窗口,選中Continue按鈕繼續進行處理,選中Stop按鈕則中斷對文件的處理。

22.向/從工具菜單添加/刪除快捷按鈕。在Options\Configuration\Toolbar對話框中單擊Select Bottons按鈕,彈出自定義工具欄對話框,然後即可根據自己的需要在工具欄中添加或刪除快捷按鈕,最多可增添至21個。單擊重啟按鈕,則可將工具欄中的按鈕恢復為WinZip 7.0預設狀態。注意:工具欄的設置需有Windows Common Control library 4.71或更高版本的支持才能夠實現,當然,如果您的操作系統已經升級為Windows 98或者安裝了IE 4.0也同樣能夠滿足需要,否則,您即應當從http://www.winzip.com/common_control_library.cgi下載該文件。另外,當將顏色設置為16位增強色或24位真彩色時,快捷按鈕看起來會更漂亮、更迷人。

23.默認文件夾設定。如果您在打開、解壓縮或添加壓縮文件時經常使用同一個文件夾,則應在Options\Configuration\Folders對話框中各項分別進行指定,以減少繁瑣的文件夾選定操作,加快工作速度。

24.保存當前窗口的大小。使用滑鼠您當然可以改變WinZip窗口的大小,但如果您想保留已經改變了的窗口尺寸使其成為默認值,應當在Options菜單中單擊Save Settings Now命令。

25.顯示WinZip多重窗口。默認狀態下,WinZip只能顯示一個窗口,若欲顯示多個WinZip窗口, 則應當取消對Options菜單中Reuse WinZip Windows選項的選擇。在同時打開的多個WinZip窗口中以滑鼠拖曳的方式即可實現文件在不同壓縮包間的復制和移動。當用滑鼠將某個文件從一個窗口拖曳到另一個時將彈出「Drag and Drop」對話框,在Action下拉列表框中選中「Add (and replace) files」選項則將該文件添加到(即復制到)目標壓縮包中,若目標壓縮包中包含有同名文件則以該文件取而代之,選中「Move files」選項則將該文件移動到目標壓縮包之中。

26.使用類似於Internet Explorer 4.0風格的用戶界面。如果在Internet Explorer 4.0 中選中了Active Desktop(活動桌面)選項,那麼在WinZip中它將自動生效,否則,您可以在Options\Configuration\View對話框中對其進行設置。操作如下:首先取消對「Use current system folder settings」復選框的選擇,然後選中「Single-click to open an item(point to select)」復選框,文件列表中的條目將改變成為一個個超級鏈接,指向該條目時即為選中,只需單擊滑鼠左鍵即可應聲打開。若選中「Underline file names」選項按鈕,則條目顯示為普通文字格式不帶有作為超級鏈接標志的下劃線;若選中「Underline file names only when I point at them」選項按鈕,則每個條目下方均顯示一線下劃線,呈典型的超級鏈接。

27.重新顯示每日提示。如果你關閉了WinZip每日提示信息後又想恢復顯示它的話,可在WinZip主窗口的Help下拉菜單中選中「Tip of the Day」命令,然後再在「WinZip Tip of the Day」窗口底部的下拉列表框中根據需要選擇中意的顯示方式,Always show tips at startup每次運行WinZip時均顯示提示窗口,Show tips at startup if not opening a Zip file如果在運行WinZip時沒有打開Zip文件則顯示窗口。

Ⅳ 巧用excel排序和篩選功能製作學生

一張含有大量數據的Excel表格,裡面難免會有重復的數據,我們如何快速刪除大量重復的數據呢?這裡面會用到Excel篩選的小技巧,今天柯鳴就教給大家如何巧用Excel排序和篩選功能。
快速刪除重復數據
首先我們選中整個表格,單擊數據選項卡,選擇「排序和篩選」欄目下的高級,並單擊,彈出高級篩選對話框,在裡面分別選擇列表區域和條件區域,並勾選下面的「選擇不重復記錄」的復選框,最後確定,具體操作如下圖

快速排序
首先我們選中需要排序的列表,然後單擊數據選項卡,在裡面單擊排序功能,彈出排序對話框,選擇需要排序的關鍵字,然後選擇按升序或者降序排列,如下圖

快速篩選對比數據
假如我們想在大量的銷售數據裡面對比查看張三和王五的銷售數據,我們可以先選中姓名這一列表,然後單擊數據選項卡下的篩選功能,這個時候在姓名標題下就會顯示一個下拉的三角符號,我們單擊它,彈出一個篩選下拉菜單,我們在裡面只選擇張三和王五即可,具體操作如下圖

Ⅵ 有一組數組{25、50、70、21、4、18、100、43、7、12}用快速排序,求快速排序的做題方法技巧,和原理。

12、7、18、21、4、25、100、43、70、50
你好,首先很願意幫助你。我回答過同一類型的題。我把我回答的記錄復制給你,如果還是沒有幫助的話,我再詳細的做一下你給的題目。先提示一句:一般來說快速排序,哨兵是第一個元素,放在0地址里。原始位置空下。 還有 快速排序也是兩種有序的,我的例子是非遞減。
eg:
對集合(19,14,23,01,68,84,27)以19為樞軸元素,畫出一趟快速排序的過程。求數據結構的答案...

我的回答:
[19] ___ 14 23 01 68 84 27 哨兵同27對比
[19] ___ 14 23 01 68 84 27 同84比
[19] ___ 14 23 01 68 84 27 同68比
[19] 01 14 23 __ 68 84 27 同01比 前置
[19] 01 14 23 — 68 84 27 同14比
[19] 01 14 — 23 68 84 27 同23比較 後置
(01 14 ) 19 ( 23 68 84 27 ) 哨兵恢復 第一趟快速排序完成

希望對你有幫助。

Ⅶ pascal語言中,快速排序和冒泡排序有沒有什麼技巧啊

冒泡法的時間復雜度為O(n2),快速排序的時間復雜度為O(nlog2n),當排序數的數量n比較少時用冒泡法,當n比較大時用快速排序。

Ⅷ 為什麼快速排序不能用尾遞歸來實現

遞歸過程中需要子過程計算返回結果的過程才必須要入棧。快速排序是先比較換位之後再把結果分發給兩個子過程,在執行完最後一個子過程之後程序自動結束,所以是尾遞歸的。而歸並排序需要最後一個子過程先排序,再逐級返回,繼續歸並,所以不是尾遞歸。寫程序的時候能看出來,快速排序的遞歸調用都是在函數尾部,歸並排序的遞歸調用都在函數頭部。這才是尾遞歸和非尾遞歸的區別。
所有遞歸都可以寫成迭代,但是尾遞歸可以寫成真正的迭代,非尾遞歸依舊需要一個輔助結構來模擬或者說代替遞歸所用的棧結構。不過根據問題的不同和棧結構的實現技巧,很多非尾遞歸問題都是可以通過改寫成迭代來提高性能(節約空間或者時間)的。最明顯的例子就是斐波那契數列。斐波那契數列遞歸過程中一定要先入棧,直到壓入f(0)和f(1)時才能開始出棧,所以不是尾遞歸的,但是通過一塊內存暫存上一步的結果就可以直接從f(0)和f(1)開始計算得到f(n)的值,這樣就省去了遞歸消耗的棧空間以及入棧出棧的時間開銷,所以時間和內存佔用都小得多。
另外雖然通常編譯器自帶的尾遞歸優化的效果我並沒有測試過。不過從網上一些人的測試來看,一般C編譯器的尾遞歸優化應該是和迭代效果相近,甚至我看到有人說測試結果中尾遞歸優化更快的。所以按理說只要編譯器帶有尾遞歸優化,寫法滿足優化要求,編譯器應該會自動完成優化的。

Ⅸ excel怎麼做排序,RANK函數快速排序技巧

本文介紹 Microsoft Excel 中 RANK 函數的公式語法和用法。

說明

返回一列數字的數字排位。 數字的排位是相對於列表中的其他值的大小。 (如果要對列表進行排序,則數字的秩將是其位置。)

重要:此函數已被替換為一個或多個新函數,這些函數可提供更高的精確度,其名稱更好地反映其用法。 雖然此函數仍可向後兼容,但您應該考慮從現在開始使用新函數,因為此函數在 Excel 的將來版本中可能不再可用。

語法

RANK(number,ref,[order])

RANK 函數語法具有下列參數:

Number 必需。 要找到其排位的數字。

Ref 必需。 數字列表的數組,對數字列表的引用。 Ref 中的非數字值會被忽略。

Order 可選。 一個指定數字排位方式的數字。

如果 order 為 0(零)或省略,Microsoft Excel 對數字的排位是基於 ref 為按照降序排列的列表。

如果 order 不為零,Microsoft Excel 對數字的排位是基於 ref 為按照升序排列的列表。

說明

Rank 賦予重復數相同的排位。 但重復數的存在將影響後續數值的排位。 例如,在按升序排序的整數列表中,如果數字 10 出現兩次,且其排位為 5,則 11 的排位為 7(沒有排位為 6 的數值)。

閱讀全文

與快速排序的方法與技巧相關的資料

熱點內容
上油泵安裝接頭安裝方法 瀏覽:874
用彩泥捏凳子的簡便方法 瀏覽:354
教具使用情況研究方法 瀏覽:595
手機淘寶猜你喜歡推廣方法介紹 瀏覽:995
胡夫金字塔用作比較的方法怎麼寫 瀏覽:21
蘇州牛皮癬中葯治療方法 瀏覽:714
正確的供奉方法圖片 瀏覽:393
練微笑的方法視頻教程 瀏覽:154
茅台vip用酒查真偽鑒別方法 瀏覽:143
手臂刮汗毛用什麼方法 瀏覽:738
調理肌酐最好的方法如何降 瀏覽:936
狗風疙瘩最快治療方法 瀏覽:802
大蒜治療金魚腸炎土方法怎麼治療 瀏覽:769
江蘇高質量考核發展指數計算方法 瀏覽:917
蟲牙土方法怎麼治 瀏覽:295
水膠體敷料使用方法 瀏覽:829
粉絲的訓練方法 瀏覽:778
鋁蓋發霉怎麼處理方法 瀏覽:318
做生意都有哪些賺錢的方法 瀏覽:443
黃金三角手臂鍛煉方法 瀏覽:12