歸併排序之Python3實現和c++實現

歸併排序(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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章