穩定
最差:o(nlogn)[mergesort的size取值不超過logn取上整,即最多進行logn取上整趟排序。對每一遍的size的都要掃瞄n個記錄,
所以函式mergesort的執行時間為o(nlogn)]
平均:o(nlogn)
最好:o(nlogn)
空間:o(n)[合併排序需要與原序列長度的輔助陣列temp,所需的額外空間為o(n)]
迭代版:
#include #define maxsize 100
typedef int t;
typedef struct list list;
//兩路合併過程
void merge(list *list ,t temp,int i1,int j1,int i2,int j2,int *k)
while(i<=j1)temp[(*k)++]=list->elements[i++];
while(j<=j2)temp[(*k)++]=list->elements[j++];
}//兩路合併排序的迭代演算法
void mergesort(list *list)
for(i=0;ielements[i]=temp[i];
size*=2; }}
list createlist(int n,int max) else
k ++;
}while (i <= mid)
while (j <= end)
// 對arr重新賦值,合併
for (i = 0; i < k; i ++)
arr[first + i] = temp[i];}
/** * 歸併排序遞迴過程
*/void merge_sort(int *arr, int begin, int end, int *temp)}
int main()
merge_sort(arr, 0, n - 1, temp);
printf("%lld\n", count);
free(arr);
free(temp);
}return 0;
}
八大內部排序 歸併排序
歸併排序 merge sort 將兩個或兩個以上的有序列表組合成乙個新的有序表,合併的m,n長度的兩個表的複雜度為o m n n個數的序列進行歸併共有ceil logn 次,每一次合併都是n常數級別的,所以總的複雜度為o nlogn 同時歸併排序是一種穩定的排序。如下,採用的是利用遞迴的方式書寫,要...
八大排序之歸併排序
歸併排序 merge sort 是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。我們可以這樣簡單的理解 將乙個陣列分為兩個陣列arr1 arr2,假如這兩個陣列有序,再將這兩個陣列歸併為乙個陣列,並確保歸併後的陣列也有序。關...
八大排序之歸併排序
todo 歸併排序 public class mergesort 測試時間複雜度 o n log n int arr newint 80000 int temp newint arr.length for int i 0 i arr.length i long start time system.c...