生活随笔
收集整理的這篇文章主要介紹了
算法-排序-归并排序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
歸并排序
特點:非原址排序,比較排序,時間復雜度O(nlgn)
穩定
#include <iostream>
void merge_sort(int *arr
,int start
,int end
)
{if(start
< end
){int middle
= (start
+ end
)/2;merge_sort(arr
,start
,middle
);merge_sort(arr
,middle
+1,end
);int *left_arr
= new int[middle
- start
+ 2];int *right_arr
= new int[end
- start
+ 2];for (int i
= start
; i
< middle
+1; ++i
) {left_arr
[i
-start
] = arr
[i
];}left_arr
[middle
-start
+1] = INT_MAX
;for(int i
= middle
+1;i
<end
+1;i
++){right_arr
[i
-middle
-1]= arr
[i
];}right_arr
[end
- middle
] = INT_MAX
;int left
=0,right
= 0;for (int i
= start
; i
< end
+1; ++i
) {if(left_arr
[left
]<right_arr
[right
]){arr
[i
] = left_arr
[left
];left
++;}else{arr
[i
] = right_arr
[right
];right
++;}}delete [] left_arr
;delete [] right_arr
;}
}void show(int *arr
,int length
)
{for(int i
=0;i
<length
;i
++){std
::cout
<<arr
[i
]<<" ";}std
::cout
<<std
::endl
;
}int main()
{int arr
[] = {1,4,6,9,2,5,10,3,7};show(arr
,sizeof(arr
)/sizeof (int));merge_sort(arr
,0,sizeof(arr
)/sizeof (int)-1);show(arr
,sizeof(arr
)/sizeof (int));
}
內涵插入排序的歸并排序
時間復雜度
Θ(nk+nlg(n/k))
k取lgn
void merge(int *arr
,int start
,int end
,int middle
)
{int *left_arr
= new int[middle
- start
+ 2];int *right_arr
= new int[end
- start
+ 2];for (int i
= start
; i
< middle
+1; ++i
) {left_arr
[i
-start
] = arr
[i
];}left_arr
[middle
-start
+1] = INT_MAX
;for(int i
= middle
+1;i
<end
+1;i
++){right_arr
[i
-middle
-1]= arr
[i
];}right_arr
[end
- middle
] = INT_MAX
;int left
=0,right
= 0;for (int i
= start
; i
< end
+1; ++i
) {if(left_arr
[left
]<right_arr
[right
]){arr
[i
] = left_arr
[left
];left
++;}else{arr
[i
] = right_arr
[right
];right
++;}}delete [] left_arr
;delete [] right_arr
;
}
void merge_sort_internal_insertion(int *arr
,int start
,int end
,int k
)
{if(end
- start
+ 1> k
){int middle
= (start
+ end
)/2;merge_sort_internal_insertion(arr
,start
,middle
,k
);merge_sort_internal_insertion(arr
,middle
+1,end
,k
);merge(arr
,start
,end
,middle
);}else{insertion_sort(arr
,start
,end
);}
}
內部插入排序代碼地址:插入排序
案例:利用歸并排序的原理,求逆序對的個數:
代碼地址
總結
以上是生活随笔為你收集整理的算法-排序-归并排序的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。