sort

sort

名詞n. [C] 1.種類,品種,類型 All sorts of lamps are available in that shop. 在那家商店可買到各式各樣的燈具。 That's just the sort of thing I want. 那正是我所需要的那種東西。 2.性質;性格 3.(常與修飾語連用)某種人,某類人[S1] She's a happy-go-lucky sort. 她是個樂天派。 4.方式,樣子 5.【電腦】排序

基本信息

單詞意思

名詞n. [C]

1.種類,品種,類型

All sorts of lamps are available in that shop.

在那家商店可買到各式各樣的燈具。

That's just the sort of thing I want.

那正是我所需要的那種東西。

2.性質;性格

3.(常與修飾語連用)某種人,某類人[S1]

She's a happy-go-lucky sort.

她是個樂天派。

4.方式,樣子

5.【電腦】排序

及物動詞vt.

1.把...分類

They sort apples by grade.

他們把蘋果按等級分類。

2.挑選,區分

Can't you sort the good from the bad?

你難道不會區分好壞嗎?

3.整理

C++

頭檔案

#include <algorithm>

原型

template< class RandomIt >
void sort( RandomIt first, RandomIt last );
(1)
template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );
(2)

sort(first,last)

注意:此處的first,last是兩個地址,且有如下特性:

一般的,last並非所需排列數組的最後一個元素,而是first+元素個數,例如以下程式段:

int a[4] = {4,3,2,1};

此時對數組a進行排列,命令為:

sort(a,a+4);

在[first, last]中的元素進行排序按升序排列

first, last-範圍內的元素進行排序
comp- 比較函式,如果第一個參數小於第二個該函式,返回true。比較函式的簽名應該相當於以下 :bool cmp(const Type1 &a, const Type2 &b); 簽名不需要const &,但是函式不能修改對象傳遞給它。類型1和類型2他類型必須是這樣一個類型的對象的引用,然後RandomIt可以隱式轉換為兩人。

命令

簡介

sort是Linux命令,主要用於排序檔案、對已排序的檔案進行合併,並檢查檔案以確定它們是否已排序。

語法

sort [ -A ] [ -b ] [ -c ] [ -d ] [ -f ] [ -i ] [ -m] [ -n ] [ -r ] [ -u ] [ -o OutFile ] [ -t Character ] [ -T Directory ] [ -y [ Kilobytes ] ] [ -z RecordSize ] [ [ + [ FSkip ] [ .CSkip ] [ b ] [ d ] [ f ] [ i ] [ n ] [ r ] ] [ - [ FSkip ] [ .CSkip ] [ b ] [ d ] [ f ] [ i ] [ n ] [ r ] ] ] ... [ -k KeyDefinition ] ... [ File ... ]

描述

sort 命令對 File 參數指定的檔案中的行排序,並將結果寫到標準輸出。如果 File 參數指定多個檔案,那么 sort 命令將這些檔案連線起來,並當作一個檔案進行排序。-(減號)代替檔案名稱指定標準輸入。如果您不指定任何檔案名稱,那么該命令對標準輸入排序。可以使用 -o 標誌指定輸出檔案。

如果不指定任何標誌,sort 命令基於當前語言環境的整理順序對輸入檔案的所有行排序。

關鍵字

排序關鍵字是輸入行的一部分,由欄位號和列號指定。欄位是輸入行的組成部分,由欄位分隔設定分隔。預設欄位分隔設定是由一個或多個連續空格字元組成的序列。使用 -t 標誌可指定不同的欄位分隔設定。在 C 語言和英語語言環境下,制表符和空格字元都是空格符。

使用排序關鍵字時,sort 命令首先根據第一個排序關鍵字的內容對所有行排序。然後,根據第二個排序關鍵字的內容,對所有第一個排序關鍵字相同的行排序,如此進行下去。按照排序關鍵字在命令行中出現的順序給它們編號。如果兩行對所有排序關鍵字的排序都相同,則對全部行依據當前語言環境的整理順序進行比較。

對欄位中的列進行編號時,預設欄位分隔設定中的空格符將作為後繼欄位計數。前導空格不計作第一欄位的一部分,-t 標誌指定的欄位分隔設定將不作為欄位的一部分計數。可使用 -b 標誌忽略前導空格符。

可使用下列兩種方法定義排序關鍵字:

* -k KeyDefinition

* FSkip.CSkip(廢棄版本)。

使用 -k 標誌定義排序關鍵字

-k KeyDefinition 標誌採用下列形式:

-k [ FStart [ .CStart ] ] [ Modifier ] [ , [ FEnd [ .CEnd ] ][ Modifier ] ]

排序關鍵字包括所有以 FStart變數指定的欄位和 CStart 變數指定的列開頭的及以 FEnd 變數指定的欄位和 CEnd 變數指定的列結束的字元。如果不指定 Fend,就假定行的最後一個字元。如果不指定 CEnd,就假定 FEnd 欄位的最後一個字元。KeyDefinition 變數中的任何欄位號或列號都可以省略。預設值為:

FStart 行開頭

CStart 欄位第一列

FEnd 行結束

CEnd 欄位最後一列

如果欄位間有任意空格,sort 就把它們看作分隔的欄位。

Modifier變數的值可以是字母 b、d、f、i、n 或 r 中的一個或多個。修飾符僅套用於它們連線的欄位定義,與同一字母的標誌有同樣的效果。修飾符字母 b 僅套用於其連線的欄位定義的末尾。例如:

-k 3.2b,3r

指定排序關鍵字,從第三欄位的第二非空格列開始並擴展至第三欄位結束,對這個關鍵字的排序以逆向整理順序完成。如果 FStart 變數和 CStart 變數在命令行末尾以外或在 FEnd 變數和 CEnd 變數之後,那么該排序關鍵字被忽略。

排序關鍵字也可用下列方式指定:

[+[FSkip1] [.CSkip1] [Modifier] ] [-[FSkip2] [.CSkip2] [Modifier]]

+FSkip1 變數指定跳過的欄位數以到達排序關鍵字第一欄位,+CSkip 變數指定在該欄位中跳過的列數以到達排序關鍵字第一個字元。-FSkip 變數指定跳過的欄位數以到達排序關鍵字後的第一個字元,-CSkip 變數指定在該欄位中跳過的列數。可以省略任何要跳過的欄位和列。預設值為:

FSkip1 行開頭

CSkip1 零

FSkip2 行結束

CSkip2 零

Modifier 變數指定的修改量與 -k 標誌關鍵字排序定義中的相同。

因為 +FSkip1.CSkip1 變數指定到達排序關鍵字前要跳過多少欄位和列,所以這些變數指定的欄位號和列號通常比排序關鍵字本身的欄位號和列號小 1。例如:

+2.1b -3r

指定排序關鍵字,從第三欄位的第二非空格列開始並擴展至第三欄位結束,對這個關鍵字的排序以逆向整理順序完成。語句 +2.1b 指定跳過兩個欄位,然後跳過前導空格和另一列。如果 +FSkip1.CSkip1 變數在命令行末尾以外或在 -FSkip2.CSkip2 變數之後,則忽略該排序關鍵字。

註:一行的最大欄位數為 10。

標誌

註:在任何排序關鍵字定義前出現的 -b、-d、-f、-i、-n 或 -r 標誌套用於所有排序關鍵字。-b、-d、-f、-i、-n 或 -r 標誌都不能單獨出現在 -k KeyDefinition 之後;如果它們作為修飾符連線 KeyDefinition 變數,那么就只套用於連線排序關鍵字。如果這些標誌之一跟隨在 +Fskip.Cskip 或 -Fskip.Cskip 排序關鍵字定義後,那么該標誌只能用於此排序關鍵字。

-A 使用 ASCII 整理順序代替當前語言環境的整理順序在逐位元組的基礎上排序。

-b 忽略前導空格和制表符,找出欄位的第一或最後列。

-c 檢查輸入是否已按照標誌中指定的排序規則進行排序。如果輸入檔案排序不正確,就返回一個非零值。

-d 使用字典順序排序。比較中僅考慮字母、數字和空格。

-f 比較前將所有小寫字母改成大寫字母。

-i 比較中忽略所有非列印字元。

-k KeyDefinition 指定排序關鍵字。KeyDefinition 選項的格式為:

[ FStart [ .CStart ] ] [ Modifier ] [ , [ FEnd [ .CEnd ] ][ Modifier ] ]

排序關鍵字包括所有以 FStart 變數指定的欄位和 CStart 變數指定的列開頭的字元及以 FEnd 變數指定的欄位和 CEnd 變數指定的列結束的字元。Modifier 變數的值可以是 b、d、f、i、n 或 r。 修飾符與同一字母的標誌等價。

-m 只合併多個輸入檔案;假設輸入檔案已經排序。

-n 按算術值對數字欄位排序。數字欄位可包含前導空格、可選減號、十進制數字、千分位分隔設定和可選基數符。對包含任何非數字字元的欄位進行數字排序會出現無法預知的結果。

-o OutFile 將輸出指向OutFile參數指定的檔案,而不是標準輸出。OutFile 參數值可以與 File 參數值相同。

-r 顛倒指定排序的順序。

-t Character 指定 Character 為單一的欄位分隔設定。

-u 禁止按照排序關鍵字和選項的所有等同排序(每一組行中一行除外)。

-T Directory 將創建的所有臨時檔案放入 Directory 參數指定的目錄中。

-y[Kilobytes] 用 Kilobytes 參數指定的主存儲的千位元組數啟動 sort 命令,並根據需要增加存儲量。(如果 Kilobytes 參數指定的值小於最小存儲站點或大於最大存儲站點,就以這個最小存儲站點或最大存儲站點取代)。如果省略 -y 標誌,sort 命令以預設的存儲大小啟動。-y0 標誌用最小存儲啟動,而 -y 標誌(不帶 Kilobytes 值)用最大存儲啟動。sort 命令使用的存儲量顯著地影響性能。以大存儲量對小檔案排序將很浪費。

-z RecordSize 如果正在排序的任一行大於預設的緩衝區大小,要防止出現異常終止。指定 -c 或 -m 標誌時,省略排序階段,使用系統的預設緩衝大小。如果已排序行超出這一大小,排序異常終止。-z 選項指定排序階段最長行的記錄,因而可在合併階段分配足夠的緩衝區。RecordSize 必須指明等於或大於要合併的最長行的位元組值。

退出狀態

該命令返回以下出口值:

0 所有輸入檔案成功輸出,或指定了 -c 且正確排序了輸入檔案。

1 在 -c 選項下,檔案沒有按指定排序,或如果指定 -c 和 -u 選項,找到了兩個具有相同關鍵字的輸入行。

>1 發生錯誤。

示例

排序

1. 要在 LC_ALL、LC_COLLATE 或 LANG環境變數設定為 En_US 的情況下排序 fruits 檔案,請輸入:

LANG=En_US sort fruits

此命令序列顯示以升序詞典順序排序的 fruits 檔案的內容。每一列的字元,包括空格、數字和特殊字元都經一一比較。例如,如果 fruits 檔案包含文本:

banana

orange

Persimmon

apple

%%banana

apple

ORANGE

sort 命令顯示:

%%banana

ORANGE

Persimmon

apple

apple

banana

orange

在 ASCII 整理序列中,%(百分號)在大寫字母前,大寫字母在小寫字母前。如果您當前的語言環境指定 ASCII 之外的字元集,結果可能不同。

順序排序

sort -d fruits

此命令序列排序和顯示 fruits 檔案的內容,並且只比較字母、數字和空格。如果 fruits 檔案與示例 1 相同,那么 sort 命令顯示:

ORANGE

Persimmon

apple

apple

%%banana

banana

orange

-d 標誌忽略 %(百分號)字元,因為它不是個字母、數字或空格。(即 %%banana 被 banana 取代)。

字母分組

要將包含大寫字母和具有類似小寫行的特殊字元行分組,請輸入:

sort -d -f fruits

-d 標誌忽略特殊字元,-f 標誌忽略大小寫差異。將 LC_ALL、LC_COLLATE 或 LANG 環境變數設定為 C 的情況下,fruits 檔案的輸出結果變為:

apple

apple

%%banana

banana

ORANGE

orange

Persimmon

排序

sort -d -f -u fruits

-u 標誌告訴 sort 命令除去重複的行,使檔案中的每一行唯一。此命令序列顯示:

apple

%%banana

orange

Persimmon

不僅除去重複的 apple,而且也除去了 banana 和 ORANGE。除去這些是因為 -d 標誌忽略 %% 這個特殊字元,-f 標誌忽略大小寫差異。

實例

sort -u +0 -d -f +0 fruits

輸入 +0 -d -f 完成的排序與示例 3 中 -d -f 的排序類型相同,+0 進行另一項比較以區分不一樣的行。這防止 -u 標誌將它們除去。

示例 1 所示的 fruits 檔案中,添加的 +0 將 %%banana 與 banana 及 ORANGE 與 orange 區分開來。然而,apple 的兩個實例是相同的,所以其中之一被刪除。

apple

%%banana

banana

ORANGE

orange

Persimmon

字元

sort -t: +1 vegetables

此命令序列排序 vegetables 檔案,對每一行上第一個冒號後的文本進行比較。+1 告訴 sort 命令忽略第一欄位,從第二欄位的開始到該行的結束進行比較。-t: 標誌告訴 sort 命令冒號分隔欄位。如果 vegetables 包含:

yams:104

turnips:8

potatoes:15

carrots:104

green beans:32

radishes:5

lettuce:15

那么,將 LC_ALL、LC_COLLATE 或 LANG 環境變數設定為 C 的情況下,sort 命令將顯示:

carrots:104

yams:104

lettuce:15

potatoes:15

green beans:32

radishes:5

turnips:8

注意數字沒有按照數字排序。當用字典式分類從左至右比較每一個字元時出現這種情況。換句話說,3 在 5 之前,所以 32 在 5 之前。

排序數字

sort -t: +1 -n vegetables

此命令序列按照第二個欄位對 vegetables 檔案進行數字排序。如果 vegetables 檔案與示例 6 中的相同,那么 sort 命令將顯示:

radishes:5

turnips:8

lettuce:15

potatoes:15

green beans:32

carrots:104

yams:104

8. 要對多個欄位排序,請輸入:

sort -t: +1 -2 -n +0 -1 -r vegetables

sort -t: -k2,2 n -k1,1 r vegetables

此命令序列對第二欄位(+1 -2 -n)進行數字排序。在這個順序中,它以逆字母順序(+0 -1 -r)對第一欄位排序。將 LC_ALL、LC_COLLATE 或 LANG 環境變數設定為 C 的情況下,輸出將類似於:

radishes:5

turnips:8

potatoes:15

lettuce:15

green beans:32

yams:104

carrots:104

此命令按數字順序對行排序。當兩行數字相同時,它們以逆字母順序出現。

原始檔案

sort -o vegetables vegetables

此命令序列將排序輸出存入 vegetables 檔案( -o vegetables)。

檔案

/usr/bin/sort 包含 sor排序函式

庫函式

sort(A)若A是向量不管是列還是行向量,默認都是對A進行升序排列。sort(A)是默認的升序,而sort(A,'descend')是降序排序。

sort(A)若A是矩陣,默認對A的各列進行升序排列

sort(A,dim)

dim=1時等效sort(A)

dim=2時表示對A中的各行元素升序排列

看下面的例子

>> A=magic(3)

A =

8 1 6

3 5 7

4 9 2

>> sort(A)

ans =

3 1 2

4 5 6

8 9 7

>> sort(A,1)

ans =

3 1 2

4 5 6

8 9 7

>> sort(A,2)

ans =

1 6 8

3 5 7

2 4 9

===================

Matlab中給一維向量排序是使用sort函式:sort(A),排序是按升序進行的,其中A為待排序的向量;若欲保留排列前的索引,則可用 [sA,index] = sort(A),排序後,sA是排序好的向量,index 是 向量sA 中對 A 的索引。 索引使排列逆運算成為可能。

事實上,這裡 A ≡sA(index) ,[A恆等於sA(index)],這個結論確實很奇妙,而且很有用。不信你排序之後試下鍵入命令 sA(index),看看得到的是不是就是排列前的A呢。

=====================

在Matlab中排序某個向量(一維)時,可以使用sort(A),其中A為待排序的向量,如果僅是用來排序A,那么直接使用sort(A)即可,如果排序後還需要保留原來的索引可以用返回值,即[B,ind]=sort(A),計算後,B是A排序後的向量,A保持不變,ind是B中每一項對應於A中項的索引。排序是安升序進行的。

在Matlab中,訪問矩陣中的元素,一維用A(1)訪問向量A的第一個元素;(下標從1開始);二維用A(1,2)訪問A中第一行,第二列的元素。

由於在sort函式的結果中,是安升序排序的,要轉換成降序,先用X=eye(n)生成一個n維的單位陣,然後用X=rot90(X)將其旋轉為次對角線的單位陣,再用原來矩陣乘以X即可,如要講A逆序排列採用如下步驟:

X=eye(size(A));

X=rot90(X);

A=A*X;

假如a是一個2*n的矩陣,即兩行.

b=a(1,:);

[c,pos]=sort(b);%pos為排序後的下標,c為第一行的排序結果;

a(2,:)=a(2,pos);%第二行按照第一行排序的下標對應

a(1,:)=c;%第一行結果重新賦給a 的第一行

以下適用於m*n的矩陣按第一行排序

[ b, pos ] = sort( a( 1, : ) );

a = a( :, pos );

=======================

matlab按某一列排序,其他列不變辦法b=sortrows(a,2) %a 為要排序的矩陣。2表示按第幾列進行排序,整數代表升序,負數代表降序。

%將矩陣a按照第2列的升序排列,其他列不會作升序排列,而是將跟隨著第2列 的變化,保持一一對應。

b=sortrows(a,-3)

%將矩陣a按照第3列的降序排列,其他列將跟隨著第3列 的變化,保持一一對應。

data =

1 3 2

7 6 5

4 9 8

sortrows(data,1)

ans =

1 3 2

4 9 8

7 6 5

sortrows(data,-1)

ans =

7 6 5

4 9 8

1 3 2 /var/tmp sort 命令處理期間的臨時空間。

/usr/tmp 如果不能在 /var/tmp 中創建檔案,是 sort 命令處理期間的臨時空間。

/tmp 如果不能在 /var/tmp 或 /usr/tmp 中創建檔案,是 sort 命令處理期間的臨時空間。

二、std:sort

函式

sort 函式

bool sort( array &array [, int sort_flags] )

本函式對數組進行排序。當本函式結束時數組單元將被從最低到最高重新安排。

注:本函式為 array中的單元賦予新的鍵名。這將刪除原有的鍵名而不僅是重新排序。

如果成功則返回 TRUE,失敗則返回 FALSE

相關詞條

相關搜尋

熱門詞條

聯絡我們