算法笔记2——归并排序

来源:互联网 发布:oppor9切换4g网络设置 编辑:程序博客网 时间:2024/05/16 17:30

1、归并排序思想

归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。

  将n个数,分成两部分,只要这两部分都已经排好序,那么合并这两部分的时间复杂度就只要O(N)。如a[1,3,4]和b[2,4,5,6],每次只要在a拿出一个,在b拿出一个比较,然后将小的放入临时c中,a或b为空时,只需要把另一个不为空的所剩下的都追加到c后面即可,因为a和b是有序的。

这样利用上面的方法,只要将n个数分成两组,这两组在分成两组,一直递归到只有两个数,将这两个数合并,一直递归回去。这样递归回的两部分都是排序好的。如图:

2、归并排序效率

设数列长为N,将数列逐步分解成两部分一共要logN步,每步都是一个合并有序数列的过程,合并的时间复杂度可以记为O(N),故一共为O(N*logN)。

空间复杂度为 O(N)

比较次数介于(NlogN)/2和(NlogN)-N+1,赋值操作的次数是(2NlogN)。

归并排序比较占用内存,但却是一种效率高且稳定的算法。

3、归并排序实现

a)C实现

void Merge(int* arr, int start, int mid, int end)//合并arr[start,mid],arr[mid+1,end],且两边都是有序的{int nlen = end - start + 1;int* pTemp = (int*)malloc(nlen * sizeof(int));//考虑不断的malloc也会影响效率,可以在MergeSort多一个参数,传入一个内存空间来存放临时的数据,如:MergeSort(int *pArr, int start, int end,int *pTemp),int i = start;int j = mid+1;int k = 0;while (i <= mid && j <= end){if (arr[i] < arr[j] ){pTemp[k++] = arr[i++];}else{pTemp[k++] = arr[j++];}}while(i <= mid){pTemp[k++] = arr[i++];}while (j <= end){pTemp[k++] = arr[j++];}k = 0;for (i = start; i <= end; i++)//将已经排好的Temp[0,k],放回arr[start,end]{arr[i] = pTemp[k++];}free(pTemp);}void MergeSort(int *pArr, int start, int end){if (start >= end){return;}int mid = (start + end)/2;MergeSort(pArr, start, mid);MergeSort(pArr, mid+1, end);Merge(pArr, start, mid, end);}

b)Python实现

def Merge(arr, start, mid, end):list = []i = start;j = mid+1;k = 0;while i <= mid and j <= end:if arr[i] > arr[j]:list.append(arr[j]);j+=1else:list.append(arr[i])i+=1while i <= mid:list.append(arr[i])i+=1while j <= end:list.append(arr[j])j+=1i = startfor j in range(0,len(list)):arr[i] = list[j]i+=1def MergeSort(arr, start, end):if start < end:mid = (start + end)/2MergeSort(arr, start, mid)MergeSort(arr, mid+1, end)Merge(arr, start, mid, end)if __name__ =="__main__":arr = [4,3,3,1,2];MergeSort(arr,0,4);print arr;

0 0
原创粉丝点击