归并排序算法
来源:互联网 发布:win10清理注册表软件 编辑:程序博客网 时间:2024/05/07 17:39
归并排序算法是采用分治法的一个典型应用。
分治法是设计算法的一种策略,包含三步:
1、分 把原问题分解成若干子问题
2、治 (递归地)解决子问题
3、合 合并子问题的解,得到原问题的解
归并操作的工作原理如下:
第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置
第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针超出序列尾
将另一序列剩下的所有元素直接复制到合并序列尾。
示例代码:
#include<stdio.h>#include<stdlib.h>void merge(int a[], int start, int mid, int end){ int i, j, k, n1, n2; int * front, * back; //变量用于申请两个内存空间 n1 = mid - start + 1; //前一部分长度 n2 = end - mid; //后一部分长度 front = (int *) malloc (n1 * sizeof(int)) ; //申请两个空间存放排好的数组 back = (int *) malloc (n2 * sizeof(int)); /*将数组转入两个新空间中*/ for (i = 0; i < n1; i++) { front[i] = a[start + i]; } for (i = 0; i < n2; i++) { back[i] = a[mid + i + 1]; } /*将元素合并*/ i = 0; j = 0; k = start; while (i < n1 && j < n2) { if (front[i] < back[j]) { a[k++] = front[i++]; } else { a[k++] = back[j++]; } } /*将剩余元素合并*/ while (i < n1) //有点巧妙 { a[k++] = front[i++]; } while (j < n2) { a[k++] = back[j++]; }}void merge_sort(int a[], int start, int end){ int mid; if (start < end) { mid = (start + end) / 2; //将数组分解 merge_sort(a, start, mid); //前一部分用递归方法排序 merge_sort(a, mid + 1, end); //后一部分用递归方法排序 merge(a, start, mid, end); //将两个部分合并 }}int main(){ int a[8] = {1, 4, 3, 9, 6, 5, 8, 7}; int i; merge_sort(a, 0, 7); for (i = 0; i < 8; i++) { printf("%d\t", a[i]); } printf("\n"); return 0;}
0 0
- 排序算法-归并排序
- 排序算法------归并排序
- 排序算法-归并排序
- 排序算法---归并排序
- 排序算法--归并排序
- 排序算法--归并排序
- 排序算法-归并排序
- 排序算法--归并排序
- 排序算法--归并排序
- 排序算法:归并排序
- 排序算法-归并排序
- 排序算法:归并排序
- 【排序算法】归并排序
- 排序算法--归并排序
- 排序算法-归并排序
- 排序算法--归并排序
- 排序算法:归并排序
- 【排序算法】归并排序
- sysctl命令详解
- 理解KMP模式匹配算法
- android Json解析详解(详细代码)
- java 关键字与保留字
- android 字体
- 归并排序算法
- ResourceBundle读取配置文件
- 2908. Annoying painting tool
- Linux-2.6.32.2内核在mini2440上的移植(四)---根文件系统制作(2)
- linux输入帐户信息后无法进入系统并报错您的会话只持续了不到10秒........
- hdoj 1736 美观化文字
- FPGA开发之Tcl项目设计一
- 最大子串长度
- 治疗android sdk不能下载