排序——归并排序
来源:互联网 发布:五十知天命六十是什么 编辑:程序博客网 时间:2024/05/22 06:12
归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。
归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。
如 设有数列{6,202,100,301,38,8,1}
初始状态: [6] [202] [100] [301] [38] [8] [1] 比较次数
i=1 [6 202 ] [ 100 301] [ 8 38] [ 1 ] 3
i=2 [ 6 100 202 301 ] [ 1 8 38 ] 4
i=3 [ 1 6 8 38 100 202 301 ] 4
总计: 11次
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。
归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。
如 设有数列{6,202,100,301,38,8,1}
初始状态: [6] [202] [100] [301] [38] [8] [1] 比较次数
i=1 [6 202 ] [ 100 301] [ 8 38] [ 1 ] 3
i=2 [ 6 100 202 301 ] [ 1 8 38 ] 4
i=3 [ 1 6 8 38 100 202 301 ] 4
总计: 11次
实现的代码如下:
1 #include <iostream> 2 using namespace std; 3 4 //将2个有序数组a[first...mid]和a[mid+1...last]数组和合并 5 void mergearray(int a[], int first, int mid, int last, int temp[]){ 6 int i = first, j = mid + 1; 7 int m = mid, n = last; 8 int k = 0; 9 10 //通过循环将2个数组比较后有序的放入到临时数组temp中11 while (i <= m && j <= n) {12 if (a[i] <= a[j]) {13 temp[k++] = a[i++];14 }15 else {16 temp[k++] = a[j++];17 }18 }19 while (i <= m) {20 temp[k++] = a[i++];21 }22 while (j <= n) {23 temp[k++] = a[j++];24 }25 //将排好序的临时数组重新放置到原数组a中26 for (i = 0; i < k; i++) {27 a[first + i] = temp[i];28 }29 }30 31 //使用递归将数组a变成若干有序的小的数组32 void mergesort(int a[], int first, int last, int temp[])33 {34 if (first < last)35 {36 int mid = (first + last) / 2;37 mergesort(a, first, mid, temp); //左边有序38 mergesort(a, mid + 1, last, temp);//右边有序39 mergearray(a, first, mid, last, temp);40 }41 }42 43 //使用归并排序44 bool MergSort(int a[], int n)45 {46 int *p = new int[n];47 if (p == NULL) return false;48 mergesort(a, 0, n - 1, p);49 delete[] p;50 return true;51 }52 53 int main(int argc, const char * argv[])54 {55 system("color 5F");56 57 int a[10] = { 2, 1, 3, 7, 106, 8, 9, 5, 4, 76 };58 MergSort(a, 10);59 for (int i = 0; i < 10; i++){60 cout << a[i] << endl;61 }62 63 system("pause");64 return 0;65 }
2 0
- 排序—归并排序
- 排序——归并排序
- 排序——归并排序
- 排序——归并排序
- 排序——归并排序
- 排序——归并排序
- 排序——归并排序
- 排序——归并排序
- 排序——归并排序
- 排序——归并排序
- 排序算法—归并排序
- 内部排序—归并排序
- 排序算法—归并排序
- 数据结构 — 归并排序
- 数据结构 — 归并排序
- 排序3——堆排序,归并排序,快速排序
- 数据结构之排序——归并排序
- 排序新风格——归并排序
- nginx重新加载启动报错解决!
- c# 多线程学习笔记(五)读者写者问题
- [HAOI2008]硬币购物
- 排序——选择排序
- 排序——基数排序
- 排序——归并排序
- PostgreSQL mysql limit 区别
- java jdk1.7版本的ArrayList原理解析
- python+Django的web开发实例
- 查看android程序的CPU和内存消耗情况
- UISwipeGestureRecognizer的一些问题
- 3.5 cam_data结构体详解
- HDU 2196 Computer (树形DP)
- java synchronized详解