分治法排序

分治法排序

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

//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 @   Goper  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
点击右上角即可分享
微信分享提示