一、各種排序方法的時間、空間複雜度情況
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提供的...