合并排序
来源:互联网 发布:p2p网络借贷监管细则 编辑:程序博客网 时间:2024/06/11 06:12
归并过程为:
比较a[i]和b[j]的大小,若a[i]≤b[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1;否则将第二个有序表中的元素b[j]复制到r[k]中,并令j和k分别加上1,如此循环下去,直到其中一个有序表取完,然后再将另一个有序表中剩余的元素复制到r中从下标k到下标t的单元。归并排序的算法我们通常用递归实现,先把待排序区间[s,t]以中点二分,接着把左边子区间排序,再把右边子区间排序,最后把左区间和右区间用一次归并操作合并成有序的区间[s,t]。
归并操作的工作原理如下:
第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置
第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针超出序列尾
将另一序列剩下的所有元素直接复制到合并序列尾
// MergeSort.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <malloc.h>#include <stdlib.h>#include <string.h>#include <IOSTREAM>#include <CTIME>using namespace std;#define SIZE 15void MergeSort1(int*a,int length){ int step; int*p,*q,*t; int i,j,k,len1,len2; int*temp;step=1; p=a; q=(int*)malloc(sizeof(int)*length); temp=q; while(step<length){ i=0; j=i+step; k=i; len1=i+step<length?i+step:length; len2=j+step<length?j+step:length; while(i<length){ while(i<len1&&j<len2){ q[k++]=p[i]<p[j]?p[i++]:p[j++]; } while(i<len1){ q[k++]=p[i++]; } while(j<len2){ q[k++]=p[j++]; } i=j; j=i+step; k=i; len1=i+step<length?i+step:length; len2=j+step<length?j+step:length; } step*=2; t=p; p=q; q=t; } if(a!=p){ memcpy(a,p,sizeof(int)*length); } free(temp);}void Merge(int sourceArr[],int tempArr[], int startIndex, int midIndex, int endIndex){ int i = startIndex, j=midIndex+1, k = startIndex; while(i!=midIndex+1 && j!=endIndex+1) { if(sourceArr[i] > sourceArr[j]) tempArr[k++] = sourceArr[j++]; else tempArr[k++] = sourceArr[i++]; } while(i != midIndex+1) tempArr[k++] = sourceArr[i++]; while(j != endIndex+1) tempArr[k++] = sourceArr[j++]; for(i=startIndex; i<=endIndex; i++) sourceArr[i] = tempArr[i];}//内部使用递归void MergeSort(int sourceArr[], int tempArr[], int startIndex, int endIndex){ int midIndex; if(startIndex < endIndex) { midIndex = (startIndex + endIndex) / 2; MergeSort(sourceArr, tempArr, startIndex, midIndex); MergeSort(sourceArr, tempArr, midIndex+1, endIndex); Merge(sourceArr, tempArr, startIndex, midIndex, endIndex); }}void main(void){/*int array[SIZE], i;srand(time(NULL));for (i = 0;i < SIZE; i++){array[i] = rand() / 10000 + 100;}cout<<"before sort -------------"<<endl;for (i = 0; i < SIZE; i++){cout<<array[i]<<" ";}cout<<endl;MergeSort1(array, SIZE);cout<<"Sort: ------------------"<<endl;for (i = 0; i < SIZE; i++){cout<<array[i]<<" ";}cout<<endl; */ int a[8] = {50, 10, 20, 30, 70, 40, 80, 60}; int i, b[8]; MergeSort(a, b, 0, 7); for(i=0; i<8; i++) printf("%d ", a[i]); printf("\n");getchar();}
阅读全文
0 0
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- java设计模式总结九:合成模式
- XPath 语法
- 双目测距基本原理:
- 重载,重写以及多态
- log4j:WARN No appenders could be found for logger
- 合并排序
- Xcode 9:配置文件管理Xcode,但签名设置需要手动管理的配置文件
- CSS选择器
- F
- Fragment Hide and Show
- ci框架 动态选择数据库
- 禁用回车1
- JDK中的URLConnection参数详解
- 迁移Oracle数据至MySQL问题记录