数据结构学习笔记-排序3
2014-05-30 08:41
337 查看
归并排序
“归并”含义:将两个或两个以上的有序表组合成一个新的有序表。一般使用的排序方法称为2-路归并排序。
含义:假设初始序列含有n个记录,则可看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到(n/2向上取整)个长度为2或1的有序子序列;再两两归并,....,如此重复,直至得到一个长度为n的有序序列为止。
给出书上示例看得更清楚:
代码仍然出自:/article/1337332.html学习了!
这里代码中用到了一个一维数组用来存放每次归并操作结束后的序列。
仍然手敲一遍,只有细微地方略有不同。
#include<stdio.h> #include<stdlib.h> void Merge(int *, int *, int, int); void MergeSort(int *, int *, int, int); void MSort(int *,int); void Merge(int *arr, int *brr, int start, int end) { //start,mid,end代表的是数组下标 int i,j,k,mid; mid =(start+end)/2; i = start; j = mid+1; k = 0; while(i<=mid && j<=end) { if(arr[i]<=arr[j]) brr[k++] = arr[i++]; else brr[k++] = arr[j++]; } while(i<=mid) brr[k++] = arr[i++]; while(j<=end) brr[k++] = arr[j++]; /*for(i=0;i<k;i++) arr[i+start] = brr[i];*/ for(i=start,k=0;i<=end;) { arr[i++] = brr[k++]; } } void MergeSort(int *arr, int *brr, int start, int end) { if(start<end) { int mid = (start+end)/2; MergeSort(arr,brr,start,mid); MergeSort(arr,brr,mid+1,end); Merge(arr,brr,start,end); } } void MSort(int *arr, int len) { int *brr = (int *)malloc(len*sizeof(int)); MergeSort(arr,brr,0,len-1); free(brr); brr = 0; } int main() { int i,arr[10] = {10,5,66,87,446,23,75,31,41,678}; MSort(arr,10); for(i=0;i<10;++i) printf("%d ",arr[i]); return 0; }
相关文章推荐
- 数据结构学习笔记3.2—快速排序
- 数据结构学习笔记-排序2
- 数据结构学习笔记 --- 排序(冒泡排序、快速排序)
- python数据结构学习笔记-2016-10-24-02-使用排序列表实现集合ADT
- 深层次两张图解经典6大排序与6大基础数据结构——学完这些,妈妈再也不用担心我的排序算法与数据结构,学习笔记大放送
- 数据结构学习笔记 --- 排序(Gnome排序、梳排序)
- 数据结构学习笔记一:简单排序与查询算法
- 数据结构学习笔记 --- 排序(选择排序、堆排序)
- python数据结构学习笔记-2016-11-24-01-快速排序
- python数据结构学习笔记-2016-11-26-01-链表排序
- 数据结构&算法学习笔记: 快速排序
- 黑马程序员之数据结构学习笔记:插入排序
- python数据结构学习笔记-2016-10-23-02-排序
- 【数据结构学习笔记】——排序
- 黑马程序员之数据结构学习笔记:快速排序
- 数据结构学习笔记 --- 排序(冒泡排序、快速排序)
- 数据结构学习笔记 --- 排序(归并排序、基数排序)
- 数据结构学习笔记23 快速排序和基尔排序
- 数据结构学习笔记排序 (冒泡、插入、希尔、堆排序、归并排序)
- 数据结构学习笔记 --- 排序(Gnome排序、梳排序)