C語言兩種方法實現歸併排序

2021-08-20 08:14:32 字數 1465 閱讀 5232

遞迴實現歸併排序思想

使用遞迴的方法來分元素

使用臨時陣列來儲存排好序的元素

把臨時陣列中的元素拷貝給原陣列

void mergeadd(int arr, int left, int mid, int right, int *temp)

else

} while (i <= mid)

while (j <= right)

//把temp中的內容拷給arr陣列中

//進行歸併的時候,處理的區間是arr[left,right),對應的會把

//這部分區間的陣列填到tmp[left,right)區間上

memcpy(arr + left, temp + left, sizeof(int)*(right - left+1));

}void mergesort(int arr,int left,int right,int *temp)

}

測試**

int main();

int len = sizeof(arr)/sizeof(arr[0]);

int *temp = (int*)malloc(sizeof(int)*len);

mergesort(arr, 0, len - 1, temp);

free(temp);

for (int i = 0; i < len; i++)

system("pause");

return 0;

}

遞迴歸併排序性質

時間複雜度:o(nlogn)

空間複雜度:o(n)

穩定性:穩定排序

非遞迴實現歸併排序

void mergeadd1(int arr, int left, int mid, int right, int *tmp)

else

} while (i <= mid)

while (j <= right)

//把temp中的內容拷給arr陣列中

//進行歸併的時候,處理的區間是arr[left,right),對應的會把

//這部分區間的陣列填到tmp[left,right)區間上

memcpy(arr + left, temp + left, sizeof(int)*(right - left + 1));

}void mergesort2(int arr, int len,int* tmp)

//定義乙個步長gap,初始值為1,相當於每次只合併兩個長度為1的元素

int gap = 1;

for (; gap <= len; gap *= 2)

int end = mid + gap;

if (end >= len)

mergeadd1(arr, beg, mid, end, tmp);

} }}

測試**同上。

排序演算法 歸併排序的兩種方法

歸併排序是用分治思想,分治模式在每一層遞迴上有三個步驟 分解 divide 將n個元素分成個含n 2個元素的子串行。解決 conquer 用合併排序法對兩個子串行遞迴的排序。合併 combine 合併兩個已排序的子串行已得到排序結果。歸併排序時間複雜度o nlogn 每次歸併處理n個,歸併logn次...

兩種分治排序 歸併排序和快速排序(C語言)

歸併排序 思想為 在對待排序列設定乙個中心點,以此為界左右進行拆分。在左子串行和右子串行遞迴執行上述過程,直到每個序列只有乙個元素,拆分不動為止。然後對相鄰元素進行合併。待合併完成為乙個大序列後,對相鄰的大序列遞迴執行這個過程,到整個序列的左 右序列合併完了,整個排序便完了。合併思想為 搞兩個指標分...

求逆序數兩種方法 線段樹 歸併排序

題目 hdu 4911 poj 2299 第一反應是暴力掃一遍,時間複雜度o n 2 這在處理10 5的數量級的資料時一定會超時。以下給出兩種將時間複雜度優化至o nlogn 的方法 以hdu 4911為例,求逆序數的模板題 方法1,歸併排序法 在區間 l,r 上,mid l r 1 將兩串已經排好...