歸併排序和兩個優化點(C 實現)

2021-10-11 11:26:55 字數 2921 閱讀 7814

namespace sortcommon 

}return true;

}}

// 歸併過程,需要額外的輔助空間協助歸併,對arr[l....r]進行歸併,注意這裡定義的是閉區間

void merge(int arr, int l, int mid, int r)

// 由於棧資源有限,不建議使用陣列作為輔助空間用以儲存待歸併資料,實際待排序陣列往往大於棧上能開闢的最大陣列空間

int *aux = new int[r - l + 1];

memcpy(aux, arr + l, (r - l + 1) * sizeof(int));

int i = l;

int j = mid + 1;

for (int k = l; k <= r; ++k) else if (j > r) else if (aux[i - l] < aux[j - l]) else

}delete aux;

}

void mergesortadapter(int arr, int l, int r) 

int mid = l + (r - l) / 2;

mergesortadapter(arr, l, mid);

mergesortadapter(arr, mid + 1, r);

merge(arr, l, mid, r);

}// 歸併排序(自頂向下,遞迴實現)

void mergesorttd(int arr, int n)

mergesortadapter(arr, 0, n - 1);

}

void mergesortadapter(int arr, int l, int r) 

int mid = l + (r - l) / 2;

mergesortadapter(arr, l, mid);

mergesortadapter(arr, mid + 1, r);

// merge(arr, l, mid, r);

// 優化,僅在前半段的最後乙個資料大於後半段的第乙個資料,才進行歸併,此種情況下說明兩段資料存在大小交集,否則根本不用歸併

if (arr[mid] > arr[mid + 1])

}void insertsort(int arr, int n)

arr[j] = temp;}}

// 歸併排序(自頂向下,遞迴實現)

void mergesorttd(int arr, int n)

// 優化,當資料量小於乙個門限值時,採用插入排序效果更好

if (n < 16)

mergesortadapter(arr, 0, n - 1);

}

// 歸併排序(自底向上,迭代實現)

void mergesortbu(int arr, int n)

}}

void test() ;

int arr1r;

// 自底向上

mergesortbu(arr1, 9);

assert(sortcommon::arrequal(arr1, arr1r, 9));

// 資料打亂重新採用自頂向下的實現排序

std::random_shuffle(arr1, arr1+9);

mergesorttd(arr1, 9);

assert(sortcommon::arrequal(arr1, arr1r, 9));

int arr2;

int arr2r;

mergesortbu(arr2, 1);

assert(sortcommon::arrequal(arr2, arr2r, 1));

// 資料打亂重新採用自頂向下的實現排序

std::random_shuffle(arr2, arr2+1);

mergesorttd(arr2, 1);

assert(sortcommon::arrequal(arr2, arr2r, 1));

int arr3;

int arr3r;

mergesortbu(arr3, 2);

assert(sortcommon::arrequal(arr3, arr3r, 2));

// 資料打亂重新採用自頂向下的實現排序

std::random_shuffle(arr3, arr3+2);

mergesorttd(arr3, 2);

assert(sortcommon::arrequal(arr3, arr3r, 2));

int arr4;

int arr4r;

mergesortbu(arr4, 8);

assert(sortcommon::arrequal(arr4, arr4r, 8));

// 資料打亂重新採用自頂向下的實現排序

std::random_shuffle(arr4, arr4+8);

mergesorttd(arr4, 8);

assert(sortcommon::arrequal(arr4, arr4r, 8));

int arr5;

int arr5r;

mergesortbu(arr5, 3);

assert(sortcommon::arrequal(arr5, arr5r, 3));

// 資料打亂重新採用自頂向下的實現排序

std::random_shuffle(arr5, arr5+3);

mergesorttd(arr5, 3);

assert(sortcommon::arrequal(arr5, arr5r, 3));

return;

}

歸併排序 C 實現

歸併排序跟快速排序一樣,也是基於 分治法 歸併排序與快速排序的區別 快速排序是先 分治 成兩個子串行,然後呼叫本身繼續遞迴進行 分治 歸併排序是先遞迴地分成子串行,然後按演算法合併。歸併排序是先遞迴地把待排序序列分成若干子串行,直到最後分成乙個乙個元素為子串行,然後對些子串行中每個元素,依照其大小合...

C 實現歸併排序

歸併 歸併排序 merge sort 是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列 即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。演算法描...

C 歸併排序實現

基本過程 採用分治的核心思想,把乙個複雜問題拆成若干子問題求解。通過遞迴的方法,不斷對左右兩部分進行拆分 比較左右兩部分大小,不斷將左右兩部分按順序合併 實現 include include using namespace std void merge vector int nums,int low...