归并排序
2015-07-21 23:54
387 查看
1、归并排序算法描述:
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
归并过程为:取待排序区间a[left~right]的中间点mid作为分隔点,将中间点左边序列(left~mid)用i索引,右边序列(mid+1~right)用j索引,比较a[i]和a[j]的大小,若a[i]≤a[j],则将左边有序表中的元素a[i]复制到临时数组tmp[k](大小为right-left+1)中,并令i和k分别加上1;否则将右边有序表中的元素a[j]复制到tmp[k]中,并令j和k分别加上1,如此循环下去,直到其中一个有序表取完,然后再将另一个有序表中剩余的元素复制到tmp中从下标k到下标right-left的单元。递归该过程,即是归并排序。
2、归并排序算法实现:
3、算法时间复杂度和空间复杂度
归并排序的最好、最坏、平均时间复杂度均是O(nlogn).
空间复杂度是O(n),因此占用的空间较多。
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
归并过程为:取待排序区间a[left~right]的中间点mid作为分隔点,将中间点左边序列(left~mid)用i索引,右边序列(mid+1~right)用j索引,比较a[i]和a[j]的大小,若a[i]≤a[j],则将左边有序表中的元素a[i]复制到临时数组tmp[k](大小为right-left+1)中,并令i和k分别加上1;否则将右边有序表中的元素a[j]复制到tmp[k]中,并令j和k分别加上1,如此循环下去,直到其中一个有序表取完,然后再将另一个有序表中剩余的元素复制到tmp中从下标k到下标right-left的单元。递归该过程,即是归并排序。
2、归并排序算法实现:
#include <iostream> /* run this program using the console pauser or add your own getch, system("pause") or input loop */ //递归实现归并排序 void mergeSort(int theArray[], int low, int high) { if(low >= high) return; int mid = (low + high) / 2; mergeSort(theArray, low, mid); //使得mid左边有序,包括mid mergeSort(theArray, mid+1, high); //使得mid右边有序 int tmpArray[high - low + 1]; //临时数组,大小是high-low+1 int k; int i = low; int j = mid+1; k = 0; while(i <= mid && j <= high) { if(theArray[i] <= theArray[j]) { tmpArray[k++] = theArray[i++]; } else if(theArray[i] > theArray[j]) { tmpArray[k++] = theArray[j++]; } } while(j <= high) tmpArray[k++] = theArray[j++]; while(i <= mid) tmpArray[k++] = theArray[i++]; for(k = 0, i=low; k <= high-low, i <= high;) //将临时数组中已经排好顺序的序列映射到theArray的low~high段 { //使得theArray数组中low~high段有序 theArray[i++] = tmpArray[k++]; } } void printArray(int theArray[], int n) { if(theArray == NULL) return; for(int i = 0; i < n; ++i) { std::cout << theArray[i] << " "; } std::cout << std::endl; } int main(int argc, char *argv[]) { int myArray[] = {23, 18, 5, 78, 22, 33, 54, 9, 7}; int length = sizeof(myArray) / sizeof(myArray[0]); mergeSort(myArray, 0, length-1); printArray(myArray, length); return 0; }
3、算法时间复杂度和空间复杂度
归并排序的最好、最坏、平均时间复杂度均是O(nlogn).
空间复杂度是O(n),因此占用的空间较多。
相关文章推荐
- 自主架设VOIP系统
- SqlSessionFactory创建SqlSession测试mybatis的sql
- URL not found: D:\android-sdk-windows\temp\sysimg_x86-18_r02.zip (拒绝访问。)
- Oracle的SQL注入
- eclipse 配置JDK
- mysql
- CAS基础和原子类
- DLL导出类避免地狱问题的完美解决方案
- 如何修改Windows Azure Web App的时区
- android实现侧滑菜单
- 开源项目 AllJoyn 基础服务
- iOS UIBezierPath类 介绍
- iOS-CALayer图片淡入淡出动画
- javascript中10进制和其他进制之间的转换
- eclipse jni报错:UnsatisfiedLinkError: no *** in java.library.path
- 在生成convertView时,同时设置Button的OnClickListener,convertView是被不断地复用的,这样的OnClickListener也就可以被不断地复用,
- linux程序设计——套接字连接(第十五章)
- CSS相关
- H5动画交互页开发的工具
- 通过Java WebService接口从服务端下载文件