11 排序 理論篇

2022-08-22 04:03:13 字數 4256 閱讀 9715

1、排序:就是將一組雜亂無章的資料按一定的規律排列起來

2、內部排序和外部排序:

(一) 思想:每步將乙個待排序的物件,按其關鍵碼大小,插入到前面已經排好序的一組物件適當位置上,直到物件全部插入為止

(二) 分類:

1、直接插入排序:

①  思想:最基本的插入排序,將將第i個插入到前i-1個中的適當位置      

②  時間複雜度:t(n) = o(n²)

③  空間複雜度:s(n) = o(1)

④  穩定性:是一種穩定的排序,時間複雜度最壞的情況是資料已經有序,時間複雜度最好的情況是資料完全逆序

⑤  程式**:

#include"stdio.h"

#define n 8

int main()

printf("the old array is: ");

printf("\n");

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

printf("\n" );

for(i = 1; i < n; i++)}}

printf("the new array is: ");

printf("\n");

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

printf("\n" );

return 0;

}

2、  折半插入排序(二分排序):

①  思想:因為是已經確定了前部分是有序序列,所以在查詢插入位置的時候可以用折半查詢的方法進行查詢,提高效率。

②  時間複雜度:比較時的時間減為o(n㏒n),但是移動元素的時間耗費未變,所以總是得時間複雜度還是o(n²)。

③  空間複雜度:s(n) = o(1)。

④     穩定性:是一種穩定的排序

⑤     程式**:

void binsertsort(int l)

}

3、  希爾排序(縮小增量排序):

①  思想:把待排序序列分成若干較小的子串行,然後逐個使用直接插入排序法排序,最後再對乙個較為有序的序列進行一次排序,主要是為了減少移動的次數,提高效率。

②  時間複雜度:o(n的1.5次方)

③  空間複雜度:s(n) = o(1)。

④  穩定性:是一種不穩定排序

(一) 思想:是在待排序的記錄序列中,兩兩比較待排序記錄關鍵字,並交換不滿足要求的偶對,直到整個序列中所有記錄都滿足要求為止。

(二) 分類:

1、  氣泡排序:

① 思想:反覆掃瞄待排序序列,在掃瞄的過程中順次比較相鄰的兩個元素的大小,若逆序就交換位置。第一趟,從第乙個資料開始,比較相鄰的兩個資料,(以公升序為例)如果大

就交換,得到乙個最大資料在末尾;然後進行第二趟,只掃瞄前n-1個元素,得到次大的放在倒數第二位。以此類推,最後得到公升序序列。如果在掃瞄過程中,發現沒有交換,說明

已經排好序列,直接終止掃瞄。所以最多進行n-1趟掃瞄。

② 時間複雜度:t(n) = o(n²)

③ 空間複雜度:s(n) = o(1)

④ 穩定性:是一種穩定的排序,時間複雜度最好的情況是資料已經有序,時間複雜度最壞的情況是資料完全逆序

⑤   程式**:

#include"stdio.h"

#define n 8

int main()

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

}} printf("the new array is : ");

printf("\n");

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

printf("\n" );

return 0;

}

2、  快速排序:

①   思想:氣泡排序一次只能消除乙個逆序,為了能一次消除多個逆序,採用快速排序。以乙個關鍵字為軸,從左從右依次與其進行對比,然後交換,第一趟結束後,可以把序列分

為兩個子串行,然後再分段進行快速排序,達到高效。

②   時間複雜度:平均t(n) = o(n㏒n),最壞o(n²)。

③   空間複雜度:s(n) = o(㏒n)。

④   穩定性:不穩定排序。

(一) 思想:每一趟在n – i + 1 ( i = 1,2, … , n - 1)個記錄中選取關鍵字最小的記錄作為有序序列中的第i個記錄。

(二) 分類:

1、  簡單選擇排序:

① 思想:第一趟時,從第乙個記錄開始,通過n – 1次關鍵字的比較,從n個記錄中選出關鍵字最小的記錄,並和第乙個記錄進行交換。第二趟從第二個記錄開始,選擇最小的和第

二個記錄交換。以此類推,直至全部排序完畢。

② 時間複雜度:t(n) = o(n²)。

③ 空間複雜度:s(n) = o(1)。

④   穩定性:是一種不穩定排序

⑤ 程式**:

#include"stdio.h"

#define n 8

int main()

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

}} printf("the new array is: ");

printf("\n");

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

printf("\n" );

return 0;

}

2、堆排序:

① 思想:把待排序記錄的關鍵字存放在陣列r[1…n]中,將r看成是一刻完全二叉樹的順序表示,每個節點表示乙個記錄,第乙個記錄r[1]作為二叉樹的根,一下個記錄r[2…n]依次逐

層從左到右順序排列,任意節點r[i]的左孩子是r[2i],右孩子是r[2i+1],雙親是r[i/2向下取整]。然後對這棵完全二叉樹進行調整建堆。

② 時間複雜度:t(n) = o(n㏒n)

③ 空間複雜度:s(n) = o(1)

④ 穩定性:是一種不穩定排序 

1、  歸併排序:

① 思想:假設初始序列右n個記錄,首先將這n個記錄看成n個有序的子串行,每個子串行的長度為1,然後兩兩歸併,得到n/2向上取整 個長度為2(n為奇數時,最後乙個序列的長

度為1)的有序子串行。在此基礎上,在對長度為2的有序子串行進行兩兩歸併,得到若干個長度為4的有序子串行。如此重複,直至得到乙個長度為n的有序序列為止。

② 時間複雜度:t(n) = o(n㏒n)。

③ 空間複雜度:s(n) = o(n)。

④ 穩定性:是一種穩定排序

(1)簡單排序法一般只用於n較小的情況(例如n<30)。當序列的記錄「基本有序」時,直接插入排序是最佳的排序方法。如果記錄中的資料較多,則應採用移動次數較少的簡單選擇排序法。

(2)快速排序、堆排序和歸併排序的平均時間複雜度均為o(n㏒n),但實驗結果表明,就平均時間效能而言,快速排序是所有排序方法中最好的。遺憾的是,快速排序在最壞情況下

的時間效能為o(n²)。堆排序和歸併排序的最壞時間複雜度仍為o(n㏒n),當n較大時,歸併排序的時間效能優於堆排序,但它所需的輔助空間最多。

(3)可以將簡單排序法與效能較好的排序方法結合使用。例如,在快速排序中,當劃分子區間的長度小於某值時,可以轉而呼叫直接插入排序法;或者先將待排序序列劃分成若干

子串行,分別進行直接插入排序,然後再利用歸併排序法,將有序子串行合併成乙個完整的有序序列。

(4)從排序的穩定性上來看,在所有簡單排序法中,簡單選擇排序是不穩定的,其他各種簡單排序法都是穩定的。然而,在那些時間效能較好的排序方法中,希爾排序、快速排

序、堆排序都是不穩定的,只有歸併排序、基數排序是穩定的。

1、排序類別

2、優劣性

3、最優排序總結 

(1)序列完全有序,或者序列只有尾部部分無序,且無序資料都是比較大的值時,【直接插入排序】最佳(哪怕資料量巨大,這種情形下也比其他任何演算法快)

(2)資料基本有序,只有少量的無序資料零散分布在序列中時,【希爾排序】最佳

(3)資料基本逆序,或者完全逆序時, 【希爾排序】最佳(哪怕是資料量巨大,希爾排序處理逆序數列,始終是最好的,當然三數取中優化的快速排序也工作良好)

(4)資料報含大量重複值,【希爾排序】最佳(來自實驗測試,直接插入排序也表現得很好)

(5)資料量比較大或者巨大,單執行緒排序,且較小幾率出現基本有序和基本逆序時,【快速排序】最佳

(6)資料量巨大,單執行緒排序,且需要保證最壞情形下也工作良好,【堆排序】最佳

(7)資料量巨大,可多執行緒排序,不在乎空間複雜度時,【歸併排序】最佳

09 排序1 排序

09 排序1 排序 25 分 給定n 個 長整型範圍內的 整數,要求輸出從小到大排序後的結果。本題旨在測試各種不同的排序演算法在各種資料情況下的表現。各組測試資料特點如下 include include includeusing namespace std const int cutoff 1000...

09 排序1 排序

n個 長整型範圍內的 整數,要求輸出從小到大排序後的結果。資料2 11個不相同的整數,測試基本正確性 資料3 10 3個隨機整數 資料4 10 4個隨機整數 資料5 10 5個隨機整數 資料6 10 5個順序整數 資料7 10 5個逆序整數 資料8 10 5個基本有序的整數 資料9 10 5個隨機正...

09 排序1 排序

本題旨在測試各種不同的排序演算法在各種資料情況下的表現。各組測試資料特點如下 資料1 只有1個元素 資料2 11個不相同的整數,測試基本正確性 資料3 103個隨機整數 資料4 104個隨機整數 資料5 105個隨機整數 資料6 105個順序整數 資料7 105個逆序整數 資料8 105個基本有序的...