資料結構之八大內排序 歸併排序

2021-06-25 10:37:03 字數 1204 閱讀 2422

穩定

最差: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...