标签:
使用归并排序对n个元素进行排序。
归并排序算法是用分治策略实现对n个元素进行排序的算法。其基本思想是:
将待排序元素分成大小大致相同的2个子集合,分别对2个子集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合。
#include <stdio.h> #define N 7 void merge(int a[],int left,int mid,int right); void mergeSort(int a[],int left,int right) { if (left < right) { int mid = (left+right)/2; // 从中间划分两个子序列 mergeSort(a,left,mid); // 对左侧子序列进行递归排序 mergeSort(a,mid+1,right); // 对右侧子序列进行递归排序 merge(a,left,mid,right); // 归并 } } int b[N]; void merge(int a[],int left,int mid,int right) { // 表a的两段a[left..mid]和a[mid+1..right]各自有序,将它们合并成一个有序表 for (int m=left;m<=right;m++) b[m] = a[m]; // 将a中所有元素复制到b中 for (int i=left,j=mid+1,k=i;i<=mid&&j<=right;k++) { if(b[i]<b[j]) // 比较b的左右两段中的元素 a[k]=b[i++]; // 将较小值复制到a中 else a[k]=b[j++]; } while (i<=mid) a[k++]=b[i++]; // 若第一个表为检测完,复制 while (j<=right) a[k++]=b[j++]; // 若第二个表为检测完,复制 // 最后两个while循环只有一个会执行 } int main() { int a[] = {49,38,65,97,76,13,27}; mergeSort(a,0,N-1); for (int i=0;i<N;i++) printf("%d ",a[i]); printf("\n"); return 0; }
归并排序的时间主要分为“分-治-合”的时间。划分子序列是在常数时间内完成,最后的归并操作又可以在线性时间内完成。因此,对长度为n的元素序列进行归并排序的时间代价为
标签:
原文地址:http://www.cnblogs.com/xwz0528/p/4507547.html