分治法排序

分治法排序

通过分治模式:“分解,解决,合并 ”实现排序

//2020-12-25 00:08:59 分治法排序
//第二次修改 2021-4-25 21:41:03
#include <iostream>
#include <time.h>
#define M 2000          //待排序数组大小
#define N 2000          //数据最大值
using namespace std;

void merSort(int a[],int l,int r);
void merge_(int a[],int l,int mid,int r);

int main()
{
    int i = 0;
    int num[M] = {0};
	srand(time(NULL));

	for(i=0;i<M;i++)
	{
		num[i] = rand()%N;       //随机数赋值
	}
	printf("\n%d",i);
	getchar();
	for(i = 0;i<M;i++)
        printf("%d ",num[i]);
    printf("\n");
    getchar();

    merSort(num,0,M-1);
    for(i = 0;i<M;i++)
        cout << num[i] << " " << i <<endl;
    return 0;
}

void merSort(int a[],int l,int r)
{
    int mid = 0;
    mid = (l+r)/2;
    if(l<r)
    {

        merSort(a,l,mid);
        merSort(a,mid+1,r);
        merge_(a,l,mid,r);
    }
}

void merge_(int a[],int l,int mid,int r)
{
    int num_1[M] = {0},num_2[M] = {0};          //新数组不知道要怎么确定大小,直接用最大规模M确定了
    int i = 0,j = 0,k = 0;
    for(i = 0;i<=mid-l;i++)
        num_1[i] = a[l+i];
    for(j = 0;j<=(r-mid-1);j++)
        num_2[j] = a[mid+1+j];
    num_1[i] = 32767;                           //第一次自己写的赋值为100会出现错误,更改为int类型最大值
    num_2[j] = 32767;                           //但此方案在数据为最大值时仍会出现错误,有更好方案会进行替代
    for(k = l,i = 0,j = 0;k<=r;k++)
    {
        if(num_1[i]<=num_2[j])
        {
           a[k] = num_1[i];
           i++;
        }
        else
        {
            a[k] = num_2[j];
            j++;
        }
    }
}


//2020-12-25 00:08:59 分治法排序
#include <iostream>

using namespace std;

void merSort(int a[],int l,int r);
void merge_(int a[],int l,int mid,int r);

int main()
{
    int i = 0;
    int num[10] = {0};

    for(i = 0;i<10;i++)
        cin >> num[i];
    merSort(num,0,9);
    for(i = 0;i<10;i++)
        cout << num[i] <<endl;
    return 0;
}

void merSort(int a[],int l,int r)
{
    int mid = 0;
    mid = (l+r)/2;
    if(l<r)
    {

        merSort(a,l,mid);
        merSort(a,mid+1,r);
        merge_(a,l,mid,r);
    }
}

void merge_(int a[],int l,int mid,int r)
{
    int num_1[10] = {0},num_2[10] = {0};
    int i = 0,j = 0,k = 0;
    for(i = 0;i<=mid;i++)
        num_1[i] = a[l+i];
    for(j = 0;j<=(r-mid-1);j++)
        num_2[j] = a[mid+1+j];
    num_1[i] = 100;
    num_2[j] = 100;
    for(k = l,i = 0,j = 0;k<=r;k++)
    {
        if(num_1[i]<=num_2[j])
        {
           a[k] = num_1[i];
           i++;
        }
        else
        {
            a[k] = num_2[j];
            j++;
        }
    }
}

本人为初学者,若有不足之处请及时指出,谢谢(๑๑)

posted @ 2022-02-12 14:44  Goper  阅读(46)  评论(0)    收藏  举报