数据结构 — 归并排序
来源:互联网 发布:windows 10 mobile安卓 编辑:程序博客网 时间:2024/05/18 03:27
一、归并排序算法
1、归并:将两个以上的顺序表合并成一个新的有序表。
2、归并排序:假设有n个记录,看成n个有序序列(每个序列的长度是1),将其两两有序合并成 n/2 个含有两个或者一个元素的有序序列,之后不断重复合并这个动作,直至合并成一个含有n个元素的有序序列。
(引用大话数据结构中的排序树)
二、递归实现
#include<iostream>using namespace std;#define max_size 16void merge(int list2[] ,int ans[], int lower, int middle,int upper);void mergeSort(int list[], int ans[], int lower, int upper);/* * 将list2中的所有元素按照 lower,middle,upper, 分为两组,归并到 ans */void merge(int list2[] ,int ans[], int lower, int middle,int upper) { int i, j, k; i = k = lower; j = middle + 1; while(i <= middle && j <= upper) { if(list2[i]<list2[j]) { ans[k++] = list2[i++]; } else { ans[k++] = list2[j++]; } } if(i <= middle) { for(int l = 0; l <= middle-i; l++) { ans[k++] = list2[i+l]; } } if(j <= upper) { for(int l = 0; l <= upper-j; l++) { ans[k++] = list2[j+l]; } }}/* * 归并排序 * 1.将list 按照 middle 分成两组 分别存在 list2 中 * 2.将 list2 的 两个分组 归并到 ans */void mergeSort(int list[], int ans[], int lower, int upper) { int list2[max_size]; int middle; if(lower == upper) { ans[lower] = list[lower]; } else { middle = (lower + upper)/2; mergeSort(list, list2, lower, middle); mergeSort(list, list2, middle+1, upper); merge(list2, ans, lower, middle, upper); }} int main() { int list[max_size]; int ans[max_size]; list[0] = 16; list[1] = 7; list[2] = 13; list[3] = 10; list[4] = 9; list[5] = 15; list[6] = 3; list[7] = 2; list[8] = 5; list[9] = 8; list[10] = 12; list[11] = 1; list[12] = 11; list[13] = 4; list[14] = 6; list[15] = 14; for(int i = 0; i<max_size; i++) { cout<<list[i]<<" "; // ans[i] = list[i]; } cout<<endl; mergeSort(list, ans, 0, max_size-1); for(int i = 0; i<max_size; i++) { cout<<ans[i]<<" "; } cout<<endl; return 0; }
3、非递归实现
#include<iostream>using namespace std;#define max_size 16const int n = max_size;void merge(int list[], int sorted[], int lower, int middle, int upper) { int i,j,k; i = k = lower; j = middle + 1; while(i<=middle && j<=upper) { if(list[i]<=list[j]) { sorted[k++] = list[i++]; } else { sorted[k++] = list[j++]; } } if(i > middle){ for(int t = 0; t<=upper-j; t++) { sorted[k++] = list[j+t]; } } else { for(int t = 0; t<=middle-i; t++) { sorted[k++] = list[i+t]; } }}/* *直接归并,省去了“分”的过程 */void mergePass(int list[], int sorted[], int length) { int i, j; for(i = 0; i<=n-2*length; i+=2*length) { merge(list, sorted, i, i+length-1, i+2*length-1); } if(i+length < n){ merge(list, sorted, i, i+length-1, n-1); } else { for(j = i; j<n; j++) { sorted[j] = list[i]; } }}/*分层次,从length = 1 开始, 2^(i -1) */void mergeSort(int list[]) { int length = 1; int extra[max_size]; while(length < n) { mergePass(list, extra, length); length *= 2; mergePass(extra, list, length); length *= 2; } } int main() { int list[max_size]; list[0] = 16; list[1] = 7; list[2] = 13; list[3] = 10; list[4] = 9; list[5] = 15; list[6] = 3; list[7] = 2; list[8] = 5; list[9] = 8; list[10] = 12; list[11] = 1; list[12] = 11; list[13] = 4; list[14] = 6; list[15] = 14; for(int i = 0; i<max_size; i++) { cout<<list[i]<<" "; } cout<<endl; mergeSort(list); for(int i = 0; i<max_size; i++) { cout<<list[i]<<" "; } cout<<endl; return 0; }
0 0
- 数据结构 — 归并排序
- 数据结构 — 归并排序
- 数据结构——归并排序
- 数据结构——归并排序
- 数据结构——归并排序
- 数据结构之排序——归并排序
- 数据结构 排序 归并排序
- 【数据结构】:排序--归并排序
- 数据结构排序--归并排序
- 数据结构——2路归并排序
- 数据结构与算法——归并排序
- 数据结构——归并排序算法
- 【数据结构与算法】——归并排序
- 数据结构例程——归并排序
- 数据结构与算法——归并排序
- 数据结构—有序表—归并排序
- 【数据结构与算法】——归并排序
- 数据结构之——归并排序
- LeetCode First Missing Positive
- 非XML方式 部署redis缓冲 及自定义键值的方法如何在spring中声明它
- javaday22-IO序列流
- 用RxJava写的一个Android的小Demo
- windows 系统下CMD命令大全
- 数据结构 — 归并排序
- 零碎知识总结——学渣修行路
- 在openwrt下对华为WA633无线AP的千兆网卡驱动进行支持
- UVa-10129 单词
- 文章标题
- 柔性数组成员
- 文本框空白按钮不可按
- Arduino - 串口操作函数与示例代码大全
- IO(输入流)