排序演算法筆記(C 版)

2021-09-20 15:36:17 字數 3298 閱讀 6739

記錄最近學習的一些排序演算法

注:①第乙個演算法給出了完整的測試程式,其餘的為避免重複及節省空間,只顯示排序演算法部分**

②執行結果的程式耗時每次執行略有不同,僅供大致對比參考

時間複雜度:o(n)[最好],o(n2)[平均],o(n2)[最差]

空間複雜度:o(1)

**:

#include

#include

//計時用

using namespace std;

//氣泡排序演算法

void

bubblesort

(int data,

int n)}if

(flag)

break;}

//列印結果資訊

queryperformancecounter

(&t2)

; dt =

(t2.quadpart - t1.quadpart)/(

double

)nfreq.quadpart;

cout <<

"\n 此次排序耗時: "

<< dt *

1000000

<<

"us"

; cout <<

"\n 執行了"

<"次swap交換"

; cout <<

"\n 排序結果為:"

;for

(int i =

0; i < n; i++

) cout << data[i]

<<

" ";

cout << endl;

}//主函式

intmain

(void);

bubblesort

(testdata1,10)

;int testdata2[10]

=;bubblesort

(testdata2,10)

;return0;

}

執行結果:

待排序資料為:1 3 5 7 9 2 4 6 8 0

此次排序耗時: 2us

執行了19次swap交換

排序結果為:0 1 2 3 4 5 6 7 8 9

待排序資料為:0 1 2 3 4 9 8 7 6 5

此次排序耗時: 1.1us

執行了10次swap交換

排序結果為:0 1 2 3 4 5 6 7 8 9

請按任意鍵繼續. . .

時間複雜度:o(n2)[最好],o(n2)[平均],o(n2)[最差]

空間複雜度:o(1)

主要**:

//n-1次外迴圈,每次選出最大的放在最右邊

//內迴圈與最大值比較,記錄最大值的標籤

void

selectsort

(int data,

int n)

swap

(data[max]

, data[i]);

//count++;

}//列印結果資訊(**略)

}

執行結果:

待排序資料為:1 3 5 7 9 2 4 6 8 0

此次排序耗時: 1.1us

執行了9次swap交換

排序結果為:0 1 2 3 4 5 6 7 8 9

待排序資料為:0 1 2 3 4 9 8 7 6 5

此次排序耗時: 1us

執行了9次swap交換

排序結果為:0 1 2 3 4 5 6 7 8 9

請按任意鍵繼續. . .

時間複雜度:o(n)[最好],o(n2)[平均],o(n2)[最差]

空間複雜度:o(1)

主要**:

//插入排序

void

insertionsort

(int

* data,

int n)

data[j]

= tmp;

//插入值

}//列印結果資訊(**略)

}

執行結果:

待排序資料為:1 3 5 7 9 2 4 6 8 0

此次排序耗時: 0.3us

排序結果為:0 1 2 3 4 5 6 7 8 9

待排序資料為:0 1 2 3 4 9 8 7 6 5

此次排序耗時: 0.2us

排序結果為:0 1 2 3 4 5 6 7 8 9

請按任意鍵繼續. . .

時間複雜度:o(nlogn)[最好],o(nlogn)[平均],o(n2)[最差]

空間複雜度:o(logn)

主要**:

//軸點構造演算法

intpartition

(int x,

int lo,

int hi)

//assert:lo==hi

x[lo]

= pivot;

//將備份的軸點記錄置於前後子向量之間

return lo;

//返回軸點的秩

}//整體快速演算法

void

quicksort

(int x,

int lo,

int hi)

執行結果:

待排序資料為:1 3 5 7 9 2 4 6 8 0

此次排序耗時: 5.1us

排序結果為:0 1 2 3 4 5 6 7 8 9

請按任意鍵繼續. . .

時間複雜度:o(nlogn)[最好],o(nlogn)[平均],o(nlogn)[最差]

空間複雜度:o(n)

主要**:

//合併兩個有序陣列

void

merge

(int x,

int lo,

int mi,

int hi)

delete[

] b;

}//整體歸併演算法

void

mergesort

(int x,

int lo,

int hi)

執行結果:

待排序資料為:1 3 5 7 9 2 4 6 8 0

此次排序耗時: 4.4us

排序結果為:0 1 2 3 4 5 6 7 8 9

請按任意鍵繼續. . .

排序演算法總結 C 版)

1 時間複雜度 分析關鍵字比較次數和記錄的移動次數 2 空間複雜度 需要的輔助記憶體 3 穩定性 相同的關鍵字計算後,次序是否不變。直接插入排序 insertionsort 的基本思想是 每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子串行中的適當位置,直到全部記錄插入完成為止。例如 ...

分治演算法排序(C 版)

分治排序 把乙個陣列分成兩個陣列,然後在把這兩個陣列再各自分成兩個陣列,直到陣列有兩個數,然後比較這兩個數,並且合併,排序。就是上面這個樣子 的。不說了上 c 版 name 分治演算法 time 15 8 9 14 25 environment ubuntu 14.04,sublime text 3...

C 版 常用排序演算法。

1 個人學習記錄。2 大佬請繞道。using system.collections using system.collections.generic using unityengine namespace datastructure.wcc region 穩定排序 歸併排序 氣泡排序 插入排序。re...