数组排序问题的两种方法:插入排序算法和递归(分治)算法

本文介绍了数组排序的两种方法,分别是插入排序和归并排序。插入排序通过迭代将元素插入已排序部分,而归并排序应用分治策略,将数组分割、排序后再合并。文章提供了伪代码并展示了实验结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

            在这里我将讨论数组的排序问题,并引入插入排序算法和递归算法求解。

1、插入排序

             这里通过算法导论中的伪代码说明算法过程。

        Insertion-sort(A)

        for(j=2 to A.length)

                  key=A[j]

                  //Insert A[j] into sorted sequence A[1..j-1]

                  i=j-1

                  while(i>0 and A[i]>key)

                           A[i+1]=A[i]

                           i=i-1

                  A[i+1]=key

         //over

         算法说明:

          1)j=2,从数组的第二个元素开始迭代即当前手中的牌只有一张,桌面有A.length-1张牌;

          2)假设j为当前插入的牌。若当前牌A[j]大于手中最大的牌A[i](因为排序好了),则将其插入(最大牌)前面;

 否则当前牌需要与前面A[1..i]比较,不满足则下移,直到找到满足条件的位置i(A[i]<A[j])或者牌首(数组下标的边界0),则将其插入位置(i+1);

        

          按照上述原理,编写测试代码证明其正确性。

// method1:插入排序
void main()
{

	int a[]={3,1,6,10,9,8,14};
	int len=7;
	//cout<<len;
	int i,j;
	int key;

	for (j=1; j<len; j++)
	{
		key=a[j];
		i=j-1;

		while(i>=0 && a[i]>key)
		{

			a[i+1]=a[i];
			i--;
		}
		//find the value of position i is bigger than key
		a[i+1]=key;
	}

	//output the array
	cout<<"array sort is:\n";
	for (i=0; i<len; i++)
	{
		cout<<a[i]<<" ";
	}
	cout<<endl;
}
 

实验结果:

 

2、分治算法

      分治法的思想:将原问题分解成几个规模较小但类似于原问题的子问题,递归求解这些子问题,然后合并这些子问题的解来建立原问题的解。

         归并排序算法:1)将数组分割成2个子数组; 2)对2个子数组进行排序; 3)合并子数组的解得到原始问题的解。其中,合并数组的程序记为Merge(A,p,q,r); 待排序的数组程序记为Merge_sort(A,p,r).

         Merge(A,p,q,r)的伪代码:

              n1=q-p+1;

         n2=r-q;

         let L[1..n1+1] and R[1..n2+1] be new arrays

         for i=1 to n1

               L[i]=A[p+i-1]

         for j=1 to n2

               L[j]=A[q+j]

         L[n1+1]=无穷大

         L[n2+1]=无穷大

         i=1

         j=1

         for k=p to r

               if L[i]<=R[j]

                     A[k]=L[i]

                     i++

               else

                     A[k]=R[j]

                     j++

 

         merge_sort(A,p,r)伪代码

         if p<r

              q=(p+r)/2;

              merge_sort(A,p,q);

              mege_sort(A,q+1,r);

              merge(A,p,q,r);

 

                数组采用归并排序算法的测试程序。

//method2: 递归/分治 
#define  Large_integre 9999999999
void merge_array(int a[],int p, int q, int r)
{
	int i,j;
	int n1=q-p+1;
	int n2=r-q;

	int *a1=(int*)malloc((n1+1)*sizeof(int));
	int *a2=(int*)malloc((n2+1)*sizeof(int));

	for (i=0; i<n1; i++)
	{
		*(a1+i)=a[p+i];
	}
	a1[n1]=Large_integre;
	for (j=0; j<n2; j++)
	{
		*(a2+j)=a[q+1+j];
	}

	a2[n2]=Large_integre;

	i=0;
	j=0;
    for (int k=p; k<=r; k++)
	{
		if (a1[i]<=a2[j])
		{
			a[k]=a1[i];
			i++;
		}
		else
		{
			a[k]=a2[j];
			j++;
		}
	}

	free(a1);
	free(a2);
}

void merge_sort(int a[], int p, int r)
{
	int q;
	if (p<r)
	{
		q=(r+p)/2;
		merge_sort(a,p,q);
		merge_sort(a,q+1,r);
		merge_array(a,p,q,r);

	}
	return;
}

void main()
{
	int i,j;
	int _min,_max;
	int array[]={3,7,19,10,13,9,8,5,66};
	_min=0,_max=8;
	merge_sort(array,_min,_max);

	cout<<" Sort array by recurrence is:\n";
	for (i=0; i<=_max; i++)
	{
		cout<<array[i]<<" ";
	}
	cout<<endl;
}


实验结果:

              

         

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值