遞迴實現歸併排序思想
使用遞迴的方法來分元素
使用臨時陣列來儲存排好序的元素
把臨時陣列中的元素拷貝給原陣列
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 將兩串已經排好...