对N个随机数的插入排序和合并排序

#include <iostream>
#include <time.h>
#include <math.h>
#include <climits>	// INT_MAX
using namespace std;

const int LENGTH = 10000;

void print_array(int A[LENGTH]);
void insertion_sort(int A[LENGTH]);
void permutate(int A[LENGTH]);
void merge(int A[], int p, int q, int r);
void merge_sort(int A[], int p, int r);

int main()
{
	int A[LENGTH];
	permutate(A);
	print_array(A);
	int TimeBegin = clock();
	// insertion_sort(A);	//插入排序
	merge_sort(A, 1, LENGTH);	// 合并排序
	int TimeEnd = clock();
	print_array(A);
	cout << "Time cost: " << TimeEnd - TimeBegin << "ms" << endl;
	getchar();
	return 0;
}

void print_array(int A[LENGTH])
{
	int i;
	for(i = 0; i < LENGTH; i++)
	{
		cout << A[i] << " ";
	}
	cout << endl;
}

// 插入排序
void insertion_sort(int A[LENGTH])
{
	int i, j, key;
	for(j = 1; j < LENGTH; j++)
	{
		key = A[j];
		i = j - 1;
		while((!(i < 0)) && A[i] > key)
		{
			A[i+1] = A[i];
			i--;
			A[i+1] = key;
		}
	}
}

// 生成1-LENGTH随机数组
void permutate(int A[LENGTH])
{
	int j, k;
	srand((unsigned)time(NULL));
	for(j = 0; j < LENGTH; j++)
	{
		A[j] = 1 + rand()%(LENGTH);
		for(k = 0; k < j; k++)
		{
			if(A[j] == A[k])
			{
				j--;
				break;
			}
		}		    
	}
}

// 合并排序
void merge(int A[], int p, int q, int r)
{
	int n1, n2;
	int i, j, k;
	n1 = q - p + 1;
	n2 = r - q;
	int *L = new int[n1+1];
	int *R = new int[n2+1];
	for(i = 0; i < n1; i++)
		L[i] = A[p + i - 1];
	for(j = 0; j < n2; j++)
		R[j] = A[q + j];
	L[n1] = INT_MAX;
	R[n2] = INT_MAX;
	i = 0;
	j = 0;
	for(k = p-1; k < r; k++)
	{
		if(L[i] <= R[j])
		{
			A[k] = L[i];
			i++;
		}
		else
		{
			A[k] = R[j];
			j++;
		}
	}
	delete[] L;
	delete[] R;
}

void merge_sort(int A[], int p, int r)
{
	double qDbl;
	int q;
	if(p < r)
	{
		qDbl = floor((double)(p+r)/2);
		q = (int)qDbl;
		merge_sort(A, p, q);
		merge_sort(A, q+1, r);
		merge(A, p, q, r);
	}
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值