三種常見的排序算法
阿新 • • 發佈:2018-04-15
合並算法 合並 參考 amp 實現 insert 算法 clas 屬於
原理請參考《算法導論》
插入式排序算法實現:
void insertion_sort(int *A, int length) { int i, key; for (int j = 1; j < length; j++) {//從第二個開始判斷,保證前面有序 key = A[j]; i = j - 1; while (i >= 0 && A[i] > key) { A[i + 1] = A[i]; i--; } A[i + 1] = key;//插入 } }
遞歸實現分治,merge函數實現合並算法實現:
void merge(int *A, int p, int q, int r) {//q屬於[q, r] //分治保證L, R數組是有序的 int n1, n2, *L, *R, i, j; n1 = q - p + 1;//[p, q] n2 = r - q;//(q, r] L = new int[n1]; R = new int[n2]; for (i = 0; i < n1; i++) L[i] = A[p + i]; for (j = 0; j < n2; j++) R[j] = A[q + 1 + j]; i = j = 0; for (int k = p; k <= r; k++) { if (j == n2)//任意一邊選完了,直接進去 A[k] = L[i++]; else if (i == n1) A[k] = R[j++]; else { if (L[i] < R[j]) A[k] = L[i++];else A[k] = R[j++]; } } delete[] L; delete[] R; }
void merge_sort(int *A, int p, int r) {//p=0, r=n-1 if (p < r) { //遞歸實現分治,和二叉樹一樣,p<r自動實現過濾沒有用的節點 merge_sort(A, p, (p + r) / 2); merge_sort(A, (p + r) / 2 + 1, r); merge(A, p, (p + r) / 2, r);//此函數實現合並 } }
冒泡算法實現:
void bubble_sort(int *A, int length) { int mid; for (int i = 0; i < length; i++) { for (int j = length - 1; j > i; j--) if (A[j] < A[j - 1]) {//雙雙相比 mid = A[j]; A[j] = A[j - 1]; A[j - 1] = mid; } } }
所有代碼均經過測試,結果正確。
三種常見的排序算法