歸併排序mergeSort以及小和問題

2021-10-01 21:22:24 字數 2162 閱讀 4726

歸併排序

時間複雜度o(n*logn),額外空間複雜度o(n),實現可以做到穩定性

#include #include void merge(int a, int l, int mid, int r)//兩個陣列的合併過程,其中要注意的是要合併的兩個陣列分別一定是有序的

else

}while (i <= mid)//其餘兩個while只會實現乙個,那個陣列沒有放入help陣列當中,迴圈放入

while (j <= r)

for (int i = 0; i < k; i++)//最後將輔助陣列help當中的數值放入到當前a陣列的當前排序區域 }

void sortprosess(int a, int l, int r)

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

sortprosess(a, l, mid);//遞迴的過程就是不斷的二分

小和問題:

在乙個陣列中, 每乙個數左邊比當前數小的數累加起來, 叫做這個陣列的小和。 求乙個陣列

的小和。

例子:{1,3,4,2,5}

1左邊比1小的數,沒有

3左邊比3小的數,1

4左邊比4小的數,1,3

2左邊比2小的數,1

5左邊比5小的數,1,3,4,2

因此小和為1+1+3+1+1+3+4+2=16

還是需要強調的是merge合併過程中合併的兩個陣列分別是有序的!!因此在merge過程中只要左邊陣列有數值比右邊小,右陣列比較的該數值以及該數值之後的數值一定都大於左邊當前比較的數值 

//merge中的第乙個迴圈

while (i <= mid&&j <= r)

32左邊比32小的數, 沒有;

34左邊比34小的數, 32;

65左邊比65小的數, 32、 34;

23左邊比23小的數, 21;

22左邊比22小的數,21;    因此小和為  32+32+34+21+21=140 

#include #include int sum = 0;//----------------設定全域性變數記錄所有的小和

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

else

}while (i <= mid)

while (j <= r)

for (int i = 0; i < k; i++) }

void sortprosess(int a, int l, int r)

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

sortprosess(a, l, mid);

sortprosess(a, mid + 1, r);

merge(a, l, mid, r);

}void mergesort(int a, int n)

else }

int main()

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

printf("\n");

mergesort(a, 5);

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

printf("\n");

printf("%d\n", sum);//輸出小和

歸併排序 Merge sort

merge the a s.m and a m 1.t to r s.t template void two merge typet a,typet r,int s,int m,int t while i m r k a i while j t r k a j merge the a 0.n 1 s...

歸併排序(merge sort)

歸併排序 歸併排序是一種遞迴排序演算法,無論陣列元素的原始順序如何,其效能恆定不變。將陣列一分為二,分別排序兩部分元素,再將有序的兩半陣列歸併為乙個有序陣列。歸併步驟比較陣列前一半的元素與陣列的後一半元素,並將較小元素移到臨時陣列,該過程繼續前進,直到其中一半再沒有元素為止。此後只需將其餘元素移到臨...

歸併排序 Merge Sort

歸併排序 merge sort 是利用 歸併 技術來進行排序。歸併是指將若干個已排序的子檔案合併成乙個有序的檔案。兩路歸併演算法 1 演算法基本思路 設兩個有序的子檔案 相當於輸入堆 放在同一向量中相鄰的位置上 r low.m r m 1.high 先將它們合併到乙個區域性的暫存向量r1 相當於輸出...