c c 各種排序

2021-06-05 09:36:37 字數 3961 閱讀 4940

一、各種排序方法的時間、空間複雜度情況

1、 直接插入排序:比較次數 最少n-1次;最多(n-1)(n+2)/2 ;移動次數 最少0; 最多(n-1)(n+4)/2 使用乙個輔助儲存空間,是穩定的排序;

2 、折半插入排序:比較次數 最少與最多同,都是n*log2n(其中2為底,下邊表示同), 移動次數 最少0,最多時間複雜度為o(n2);(n的平方,以下也如此表示); 使用乙個輔助

儲存空間,是穩定的排序;

3 、氣泡排序: 比較最少為:n-1次,最多時間複雜度表示為o(n2); 移動次數最少為0,最多時間複雜度表示為o(n2); 使用乙個輔存空間,是穩定的排序;

4 、簡單選擇排序: 比較次數沒有多少之分,均是n(n-1)/2; 移動次數最少為0,最多為3(n-1); 使用乙個輔存空間,是穩定的排序;

5 、快速排序:比較和移動次數最少時間複雜度表示為o(n*log2n); 比較和移動次數最多的時間複雜度表示為o(n2); 使用的輔助儲存空間最少為log2n,最多為n的平方;是不穩定

的排序;

6 、堆排序: 比較和移動次數沒有好壞之分,都是o(n*log2n); 使用乙個輔存空間,是不穩定的排序;

7、 2-路歸併排序:比較和移動次數沒有好壞之分,都是o(n*log2n); 需要n個輔助儲存空間,是穩定的排序;

二、各種排序的c/c++實現

#include #include #include #include using namespace std;

const int size = 100000;

//列印陣列元素

void print(const int * const t);

//交換兩元素

void swap(int *p,int *q);

/* 插入排序

基本思想:

1、從第乙個元素開始,該元素可以認為已經被排序

2、取出下乙個元素,在已經排序的元素序列中從後向前掃瞄

3、如果該元素(已排序)大於新元素,將該元素移到下一位置

4、重複步驟3,直到找到已排序的元素小於或者等於新元素的位置

5、將新元素插入到該位置中

6、重複步驟2~5

*/ void insertsort(int* const t);

/* 折半插入排序

基本思想: 利用前i個元素為已經排序的特點;進行折半查詢插入位置

1、取序列的t[midd]中間位置元素與目標元素t[i]比較,如果

t[i]>t[midd],則在[midd+1,high]查詢,否則在[low,midd-1]

2、重複1,直至找到該位置

3、將high到i的元素右移

4、將t[i]元素插入high+1位置

5、重複1-4,直到i=size-1 */

void binsertsort(int* const t);

/* 希爾排序

基本思想:

1、先取乙個小於n的整數d1作為第乙個增量,把檔案的全部記錄分成d1個組。

所有距離為dl的倍數的記錄放在同乙個組中

2、先在各組內進行直接插入排序;

3、然後,取第二個增量d2t[i+1],則交換,

直到第n-1個記錄和第n個記錄比較過為止

2、重複1,直至第n-i-1個記錄和第n-i個記錄比較過為止

*/void buddlesort(int * const t);

/* 快速排序

基本思想:

1、分治法的基本思想:

將原問題分解為若干個規模更小但結構與原問題相似的子問題。

遞迴地解這些子問題,然後將這些子問題的解組合為原問題的解。

2、快速排序的基本思想

設當前待排序的無序區為r[low..high],利用分治法可將快速排序的基本思想描述為:

①分解:

在r[low..high]中任選乙個記錄作為基準(pivot),以此基準將當前無序區劃分為左、右

兩個較小的子區間r[low..pivotpos-1)和r[pivotpos+1..high],並使左邊子區間中所有

記錄的關鍵字均小於等於基準記錄(不妨記為pivot)的關鍵字pivot.key,

右邊的子區間中所有記錄的關鍵字均大於等於pivot.key,

而基準記錄pivot則位於正確的位置(pivotpos)上,它無須參加後續的排序。

注意:劃分的關鍵是要求出基準記錄所在的位置pivotpos。

劃分的結果可以簡單地表示為(注意pivot=r[pivotpos]):

r[low..pivotpos-1].keys≤r[pivotpos].key≤r[pivotpos+1..high].keys

其中low≤pivotpos≤high。

②求解:

通過遞迴呼叫快速排序對左、右子區間r[low..pivotpos-1]和r[pivotpos+1..high]快速排序。

③組合:

因為當"求解"步驟中的兩個遞迴呼叫結束時,其左、右兩個子區間已有序。

對快速排序而言,"組合"步驟無須做什麼,可看作是空操作。

*/void quicksort(int *const t,int low,int high);

/* 選擇排序

基本思想:

每一趟在n-i+1 (i=0,1,2,...,n-1)個記錄中選取最小的記錄作為有序序列中的第i個記錄

*/void selectsort(int *const t);

/* 堆排序

基本思想:

堆的定義:滿足如下約束的 n 個關鍵字序列 kl,k2,…,kn 稱為堆,1 ≤ i ≤ n/2,

(1) ki ≤ k2i 且 ki ≤ k2i+1 (小根堆) 或

(2) ki ≥ k2i 且 ki ≥ k2i+1 (大根堆)

*/void heapsort(int *const t);

//將序列建為乙個堆

void heapadjust(int *const t,int s,int m);

/* 歸併排序

基本思想:

假設初始序列為n個記錄,則可將序列看成n個有序的序列,每個序列的長度為1,

然後進行兩兩歸併,得到n/2個長度為2或者1的序列;再兩兩歸併。。。,直到

得到乙個長度為n的序列為止

*/void mergesort(int * const sr,int left,int right);

//將有序的sr[i..m]和sr[m+1..n]歸併為有序的tr[i..n]

void merge(int * const sr,int left,int midd,int right);

int main()

t[high+1] = temp;

} }

//希爾排序,也稱增量遞減排序

void shellsort(int * const t,int dk)

//最後進行增量為1的排序

shellinsert(t,1); }

//一趟希爾插入排序

void shellinsert(int * const t,int dk)

}//已經排好序

if(!flag)

}}//快速排序

void quicksort(int *const t,int low,int high)

//將小於樞紐的值與低端交換

swap(&t[i],&t[j]);

//查詢低端比樞紐大的值位置i

while(i0;i--)

for(int j=len;j>1;j--)

}//將序列建為乙個堆

void heapadjust(int *const t,int s,int m)

//將剩餘的sr[i..m]複製到tr

while(i<=midd)

//將剩餘的sr[j..m]複製到tr

while(j<=right)

//將合併好的序列值拷貝回原序列中

for(int p=0,i=left;p

C C 各種排序演算法

低階排序演算法 氣泡排序 選擇排序 插入排序 在低階排序演算法最快 高階排序演算法 快速排序 歸併排序 堆排序 演示 演示 include using namespace std void insertsort int a,int n a out temp intmain len sizeof a ...

C C 實現的各種排序

直插排序 void insertsort vector int arr else break 氣泡排序 void bubblesort1 vector int arr if flag return void bubblesort2 vector int arr if flag return 快速排序...

C C 各種計時函式

對windows平台下常用的計時函式進行總結,包括精度為秒 毫秒 微秒三種精度的5 種方法。分為在標準c c 下的二種time 及clock 標準c c 所以使用的time 及clock 不僅可以用在windows 系統,也可以用於linux系統。在windows系統下三種,使用windows提供的...