初賽知識之一 排序演算法

2021-08-28 23:51:43 字數 2711 閱讀 4938

馬上就noip初賽了。

我好心(啊呸)地為大家準備了一些知識點。

一.排序

所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。排序演算法,就是如何使得記錄按照要求排列的方法。排序演算法在很多領域得到相當地重視,尤其是在大量資料的處理方面。乙個優秀的演算法可以節省大量的資源。在各個領域中考慮到資料的各種限制和規範,要得到乙個符合實際的優秀演算法,得經過大量的推理和分析。

排序(sorting) 是計算機程式設計中的一種重要操作,它的功能是將乙個資料元素(或記錄)的任意序列,重新排列成乙個關鍵字有序的序列。

穩定度(穩定性)

乙個排序演算法是穩定的,就是當有兩個相等記錄的關鍵字r和s,且在原本的列表中r出現在s之前,在排序過的列表中r也將會是在s之前。

當相等的元素是無法分辨的,比如像是整數,穩定度並不是乙個問題。然而,假設以下的數對將要以他們的第乙個數字來排序。

(4,1)(3,1)(3,7)(5,6)在這個狀況下,有可能產生兩種不同的結果,乙個是依照相等的鍵值維持相對的次序,而另外乙個則沒有:

(3,1)(3,7)(4,1)(5,6) (維持次序)

(3,7)(3,1)(4,1)(5,6) (次序被改變)

不穩定排序演算法可能會在相等的鍵值中改變紀錄的相對次序,但是穩定排序演算法從來不會如此。不穩定排序演算法可以被特別地實現為穩定。作這件事情的乙個方式是人工擴充鍵值的比較,如此在其他方面相同鍵值的兩個物件間之比較,就會被決定使用在原先資料次序中的條目,當作乙個同分決賽。然而,要記住這種次序通常牽涉到額外的空間負擔。

在電腦科學所使用的排序演算法通常被分類為:

(a)計算的複雜度(最差、平均、和最好效能),依據列表(list)的大小(n)。

一般而言,好的效能是 o(nlogn),且壞的效能是 o(n^2)。對於乙個排序理想的效能是 o(n)。

而僅使用乙個抽象關鍵比較運算的排序演算法總平均上總是至少需要 o(nlogn)。

(b)儲存器使用量(空間複雜度)(以及其他電腦資源的使用)

(d)一般的方法:插入、交換、選擇、合併等等。交換排序包含氣泡排序和快速排序。插入排序包含希爾排序,選擇排序包括堆排序等。

c++自帶的algorithm庫函式中提供了排序演算法。

自帶排序演算法的一般形式為:

sort(arr+m,arr+n);//將陣列arr的下標為m的元素到下標為n-1的元素進行從小到大排序

sort(arr+m,arr+n,comp);//與sort(arr+m,arr+n)相比,這個寫法可以自己定義排序的規則,其中,comp為自定義的函式

對於sort(arr+m,arr+n)我們舉個簡單的例子,這個程式實現從鍵盤讀入10個數,然後從小到大輸出的功能:

當然,有時我們需要從大到小的進行排序。那麼我們可以用sort(arr+m,arr+n,comp)進行排序。

不過,在呼叫sort(arr+m,arr+n,comp)之前我們需要自己寫個comp函式。

從大到小排序的comp函式可以這樣寫:

下面是10個數從大到小排序的**:

在更多情況下,我們不僅對乙個特徵進行排序,而是多個特徵。例如將學生的成績進行排序,當然用上面的做法是行不通的。這是,我們就想到了結構體這種資料型別。當我們採用sort()函式的預設規則排序結構體時,sort()預設結構體中的第乙個成員為第一關鍵字,第二個成員為第二關鍵字,……,第n個元素為第n關鍵字,然後從小到大排序。

1.插入排序—直接插入排序(straight insertion sort)

基本思想:

將乙個記錄插入到已排序好的有序表中,從而得到乙個新,記錄數增1的有序表。即:先將序列的第1個記錄看成是乙個有序的子串行,然後從第2個記錄逐個進行插入,直至整個序列有序為止。

要點:設立哨兵,作為臨時儲存和判斷陣列邊界之用。

直接插入排序示例:

二.氣泡排序

時間複雜度o(n 2)

通過相鄰兩個數的交換來去除逆序對,以達到排序的目的。

偽**如下:

int i 

int j

if(a[i] < a[j]) a[i]<=>a[j];

c**

for(int i=0; i有一種優化的方法,設立乙個中間值mid,以及j和k,j從中間向前交換,k從中間向後交換。

偽**如下:

int i

int j

if(a[i] < a[j]) a[i]<=>a[j];

if(a[i] < a[k]) a[i]<=>a[k]

void quick_sort(int s, int l, int r)

s[i] = x;

quick_sort(s, l, i - 1); // 遞迴呼叫

quick_sort(s, i + 1, r);}}

演算法(一)排序

一 o n 2 的排序演算法 1.選擇排序 selection sort 先找到最小的 public static void selectsort int arr 2.氣泡排序 bubble sort 先找到最大的 public static void bubblesort int arr 3.插入...

演算法(一) 排序sorting

問題 輸入數字a1,a2,a3.an,使其公升序輸出。1 插入排序 insertion sort 演算法 這個演算法從陣列的第二個元素開始迴圈,將選中的元素與之前的元素一一比較,如果選中的元素小於之前的元素,則將之前的元素後移,最後再將選中的元素放在合適的位置。在這個演算法執行的過程中,總是保持著索...

java演算法(一) 排序演算法(上)

排序 sort 是將一組資料按照一定的規則來進行排列,一般按照遞增或者遞減的順序來進行排列。排序演算法是一種最基本的演算法,但是在實際應用中非常廣泛,對於初學程式設計人來說,排序演算法也是最基本的演算法之一。本節主要講解排序演算法中相對簡單的幾種,分別是 1 氣泡排序 2 選擇排序 3 插入排序 後...