归并排序(Merge sort)
1.排序思想
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
图解
2.Python3实现
##Merge sort
##python3
##Yanglin Tu
def merge_list(left_list,rigth_list):
sorted_list = []
i,j = 0, 0
while i < len(left_list) and j < len(rigth_list):
if left_list[i] < rigth_list[j]:
sorted_list.append(left_list[i])
i += 1
else:
sorted_list.append(rigth_list[j])
j += 1
sorted_list += left_list[i:]
sorted_list += rigth_list[j:]
return sorted_list
def merge_sort(unsorted_list):
if len(unsorted_list) < 2:
return unsorted_list
else:
mid = len(unsorted_list) // 2
left_list = merge_sort(unsorted_list[:mid])
rigth_list = merge_sort(unsorted_list[mid:])
return merge_list(left_list,rigth_list)
def main():
list_a = [20, 5, 7, 1, 66, 47, 5, 18]
print(list_a)
sort_list = merge_sort(list_a)
print(sort_list)
if __name__ == '__main__':
main()
3.c++实现
//Merge sort
//c++
//Yanglin Tu
#include <iostream>
using namespace std;
void merge_array(int a[], int first, int mid, int last, int temp[])
{
int i = first, j = mid + 1;
int m = mid, n = last;
int k = 0;
while (i <= m && j <= n)
{
if (a[i] <= a[j])
temp[k++] = a[i++];
else
temp[k++] = a[j++];
}
while (i <= m)
temp[k++] = a[i++];
while (j <= n)
temp[k++] = a[j++];
for (i = 0; i < k; i++)
a[first + i] = temp[i];
}
void mergesort(int a[], int first, int last, int temp[])
{
if (first < last)
{
int mid = (first + last) / 2;
mergesort(a, first, mid, temp);
mergesort(a, mid + 1, last, temp);
merge_array(a, first, mid, last, temp);
}
}
bool MergeSort(int a[], int n)
{
int *p = new int[n];
if (p == NULL)
return false;
mergesort(a, 0, n - 1, p);
delete[] p;
return true;
}
int main()
{
int i;
int list_a[] = {20, 5, 7, 1, 66, 47, 5, 18};
int length = sizeof(list_a)/sizeof(int);
for(i=0; i<length; i++)
cout<<list_a[i]<<'\t';
cout<<endl;
MergeSort(list_a,length);
for(i=0; i<length; i++)
cout<<list_a[i]<<'\t';
cout<<endl;
return 0;
}
4.性能分析
归并排序的时间复杂度O(nlogn),空间复杂度为O(n)