算法笔记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
- 算法笔记2——归并排序
- 算法导论笔记——归并排序
- 基础算法学习笔记—归并排序
- 排序算法—归并排序
- 排序算法—归并排序
- 算法笔记--归并排序
- 归并排序算法笔记
- 排序算法(2)—归并排序,快速排序
- [算法学习笔记]分而治之——归并排序
- 算法——归并排序
- 算法 —— 归并排序
- 算法——归并排序
- 算法——归并排序
- 算法——归并排序
- 排序算法(2)——归并排序
- 排序算法总结——归并排序
- 经典排序算法——归并排序
- 排序算法——归并排序
- weblogic.Admin
- Android小知识:使用android:weightSum
- 软件测试工程师企业级培训视频教程
- Volley-demo
- Python
- 算法笔记2——归并排序
- Web.xml配置详解之context-param
- 引入文件
- 在 WebLogic Server 中获取线程转储的各种方法 (文档 ID 1532594.1)
- CStdioFile 读取中文乱码 需要设定区域
- Java 汉字转首字母
- Eclipse安装插件长时间停留在calculating requirements and dependencies
- 并发 并行 同步 异步 多线程的区别
- PE文件结构详解(一)基本概念