合并排序

来源:互联网 发布: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();}


原创粉丝点击