归并排序
来源:互联网 发布:限制某个ip访问 js 编辑:程序博客网 时间:2024/06/06 04:10
本总结是是个人为防止遗忘而作,不得转载和商用。
基本思想
基本思想:将数组A[0…n-1]中的元素分成两个子数组:A1 [0…n/2]和A 2 [n/2+1…n-1]。分别对这两个子数组单独排序,然后将已排序的两个子数组归并成一个含有n个元素的有序数组。
归并排序是稳定的排序,即如果有两个49,则排序后前面的49还在前面,后面的49还在后面。
PS:快速排序和堆排序不稳定。
时间复杂度
O(nlogn)
代码
#include <stdio.h> int temp[100]; void Merge(int* a, int low, int mid, inthigh){ int i = low, j = mid + 1, size = 0; for( ; (i<=mid)&&(j<=high); size++) { if(a[i] < a[j]) temp[size] = a[i++]; else temp[size] = a[j++]; } // 有时会 i 或 j 还有没走到最后的,于是进行补充 while(i <= mid) temp[size++] = a[i++]; while(j<= high) temp[size++] = a[j++]; // 将 temp 拷贝回 a for(i = 0; i < size; i++) a[low+i] = temp[i];} void MergeSort(int* a, int low, int high){ if(low >= high) return; int mid = (low+high) / 2; // 从 low 到 mid 排序 MergeSort(a, low, mid); // 从 mid + 1 到 high 排序 MergeSort(a, mid+1, high); // 归并 Merge(a, low, mid, high);} int main(){ int a[] = {3, 56, 2, 7, 45, 8, 1}; int size = sizeof(a) / sizeof(int); int i = 0; // 对 a 进行排序,从 0 排序到 size - 1 MergeSort(a, 0, size-1); for(; i < size; i++ ) { printf("%d ", a[i]); } printf("\n"); return 0;}
0 0
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 字符串常见的几种编码方式
- 如何使用网络的bottleneck特征提升准确率
- LeetCode笔记:232. Implement Queue using Stacks
- 蓝牙的工作原理
- Linux基本命令
- 归并排序
- accept成功后获取客户端ip
- Matlab已集成了HOG特征检测
- Java设计模式之——单例模式
- 立体匹配研究背景及意义
- 牟乃夏老师的AE二次开发笔记(第一章和第二章)
- Xtreme 10.0 - Inti Sets
- Cocos2dx 中 引入pthreads 多线程
- Android动态生成RadioButton