归并排序
什么是归并排序:
- 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
归并排序的详细介绍:
- 归并排序的基础就是将两个有序数组内的数按照一定顺序合并起来。那么如何做到将两个数组合并呢?
- 这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。
- 然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。
- 代码实现。
//将有序数组a[]和b[]合并到c[]中 void MemeryArray(int *a, int n, int *b, int m, int *c) { int x,y,z; x=y=z=0; while (x<n && y<m) { if (a[x] < b[y]) c[z++] = a[x++]; else c[z++] = b[y++]; } while (x < n) c[z++] = a[x++]; while (y < m) c[z++] = b[y++]; }
- 归并排序的思想是:
- 将一个数组分为两部分A,B。如果这两部分是有序的就将这两部分合并起来。
- 如果这两部分无序,就分别将每一部分在分为两部分,依次类推,不就排好了。
- 代码实现。
#include <stdio.h> #include <stdlib.h> void MergeArray(int *a,int left,int mid,int right) { int temp[100000]; int x,y,z; x=left,y=mid+1,z=0; while(x<=mid && y<=right) { if(a[x]<a[y]) temp[z++]=a[x++]; else temp[z++]=a[y++]; } while(x<=mid) temp[z++]=a[x++]; while(y<=right) temp[z++]=a[y++]; for(x=0;x<z;x++) a[left+x]=temp[x]; } void MergeSort(int *a,int left,int right) { int mid; if(left<right) { mid=(left+right)/2; MergeSort(a,left,mid);//将右边排序 MergeSort(a,mid+1,right);//将左边排序 MergeArray(a,left,mid,right);//将左边右边合并 } } int main() { int a[]={8,3,6,2,5,7,9,1,4,0}; MergeSort(a,0,9); for(int i=0;i<10;i++) printf("%d ",a[i]); return 0; }