排序問題 粗講sort函式

2021-08-21 20:11:31 字數 3645 閱讀 9938

排序問題即把一些無序的數字,字元,字串等等具有大小比較性的變數排列成乙個有序的序列。

1.選擇排序:

原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。

**實現:

#include using namespace std;

void select_sort(int *array, int length)

int tmp = array[i];array[i] = array[ind];array[ind] = tmp; }}

int main()

; select_sort(a, 10);

for(int i = 0; i < 10; i++)

printf("%d ", a[i]);

}

2.bubble sort(氣泡排序):

原理:

重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端。

初學者接觸比較多的排序演算法,原理也很簡單。

**實現:

#include using namespace std;

void bubble_sort(int *array, int length)

} }}int main()

; bubble_sort(a, 10);

for(int i = 0; i < 10; i++)

printf("%d ", a[i]);

}

3.插入排序:

原理

插入排序的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。

**實現:略。

這裡需要講的是插入排序的乙個優化:希爾排序, 複雜度還是有很大改進的。

4.快速排序:

演算法

快速排序使用分治法(divide and conquer)策略來把乙個序列(list)分為兩個子串行(sub-lists)。

步驟為:

從數列中挑出乙個元素,稱為"基準"(pivot),

重新排序數列,所有比基準值小的元素擺放在基準前面,所有比基準值大的元素擺在基準後面(相同的數可以到任何一邊)。在這個分割槽結束之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作。

遞迴地(recursively)把小於基準值元素的子數列和大於基準值元素的子數列排序。

遞迴到最底部時,數列的大小是零或一,也就是已經排序好了。這個演算法一定會結束,因為在每次的迭代(iteration)中,它至少會把乙個元素擺到它最後的位置去。

**實現:

void quick_sort(int *array, int l, int r)

}while(i <= j);

if(l < j)//若未到邊界,繼續找。

quick_sort(a, l, j);

if(i < r)

quick_sort(a, i, r);

}

比賽中也要手打一遍快排?不存在的,接下來說說c++ sort函式

1.標頭檔案:algorithm

2.常見陣列排序

例題:hdu1425

problem description

給你n個整數,請按從大到小的順序輸出其中前m大的數。

input

每組測試資料有兩行,第一行有兩個數n,m(0output

對每組測試資料按從大到小的順序輸出前m大的數。

sample input

5 3 3 -35 92 213 -644

sample output

213 92 3

**實現:

#include #include using namespace std;

const int maxn = 1e6+5;

int a[maxn];

int cmp(int a, int b)

int main()

printf("\n");

}}

2.結構體排序:

例題:pat (basic level) practice 1015 德才論

輸入格式:

輸入第1行給出3個正整數,分別為:n(<=10^5^),即考生總數;l(>=60),為錄取最低分數線,即德分和才分均不低於l的考生才有資格被考慮錄取;h(<100),為優先錄取線——德分和才分均不低於此線的被定義為「才德全盡」,此類考生按德才總分從高到低排序;才分不到但德分到線的一類考生屬於「德勝才」,也按總分排序,但排在第一類考生之後;德才分均低於h,但是德分不低於才分的考生屬於「才德兼亡」但尚有「德勝才」者,按總分排序,但排在第二類考生之後;其他達到最低線l的考生也按總分排序,但排在第三類考生之後。

隨後n行,每行給出一位考生的資訊,包括:准考證號、德分、才分,其中准考證號為8位整數,德才分為區間[0, 100]內的整數。數字間以空格分隔。

輸出格式:

輸出第1行首先給出達到最低分數線的考生人數m,隨後m行,每行按照輸入格式輸出一位考生的資訊,考生按輸入中說明的規則從高到低排序。當某類考生中有多人總分相同時,按其德分降序排列;若德分也並列,則按准考證號的公升序輸出。

**實現 :

#include using namespace std;

struct student stu[100005];

int cmp(student a, student b)

int main()

else

} sort(stu, stu+n, cmp);

cout << n-laji << endl;

for(i = 0; i < n-laji; i++)

}

3.字串排序:

例題:洛谷p1781宇宙**

問題描述:找出n個數里最大的那個,n <= 10^100.

**實現:

#include using namespace std;

struct noden[25];

int cmp(node a, node b)

int main()

sort(n+1, n+n+1, cmp);

cout << n[1].num << endl;

cout << n[1].s;

}

大概就那麼幾個種類吧,題目很簡單,但是排序最難的就是時間複雜度的優化,不然很容易會超時,sort函式也不是萬能的,這裡我還沒有涉及歸併排序,原因在於,若是只考慮排序,歸併排序並不是乙個實用的排序演算法,但是有時候,如果遇到多重排序,可能需要歸併排序大顯身手了,好吧,我就講那麼多,希望對你們有用吧!

sort排序函式

所以自己總結了一下,首先看sort函式見下表 函式名 功能描述 sort 對給定區間所有元素進行排序 stable sort 對給定區間所有元素進行穩定排序 partial sort 對給定區間所有元素部分排序 partial sort copy 對給定區間複製並排序 nth element 找出給...

sort 排序函式

需要標頭檔案 語法描述 sort begin,end,cmp cmp引數可以沒有,如果沒有預設公升序排序。sort函式使用例項 include include includeusing namespace std int main sort a,a 5 for int i 0 i 5 i cout ...

sort 排序函式

include include 因為用了sort 函式 include 因為用了greater using namespace std void main int i int len sizeof a sizeof int 這裡切記要除以sizeof int sort a a len,greater...