1. 程式人生 > >演算法設計與分析:第二章 遞迴 2.6基於遞迴的插入排序

演算法設計與分析:第二章 遞迴 2.6基於遞迴的插入排序

/*
基於遞迴的插入排序:
將待插入的關鍵字插入到已經排好序的序列中

遞迴基:當陣列元素個數n=1時,只有一個元素,已經是排序的
遞迴步:如果前面k-1個元素已經排序,只要將第k個元素逐漸與
前面k-1個元素比較,把他插入到適當位置,即可完成k個元素的排序

遞迴的規律總結:
一般先執行遞迴,再執行遞迴體,這樣就可以把基本的操作放在最後完成了。

樣例輸入:
4
1 4 3 2
10
1 9 8 5 6 3 4 2 0 7
樣例輸出:
1 2 3 4
0 1 2 3 4 5 6 7 8 9
*/

#include <stdio.h>

const int MAXSIZE = 10000;

void insertSort_recursion(int* pArr,int n)
{
	if(!pArr || n <= 0)
	{
		return;
	}
	n--;//注意,我們儲存的陣列元素範圍仍然是0~n-1
	int iReserveNum;//記錄待比較元素
	if(n > 0)//遞迴主體
	{
		insertSort_recursion(pArr,n);//先執行遞迴,這樣最小操作會放在最後完成
		iReserveNum = pArr[n];
		int k = n - 1;
		while(k >= 0 && pArr[k] > iReserveNum)//前>後,後移
		{
			pArr[k+1] = pArr[k];//後移
			k--;
		}
		pArr[k+1] = iReserveNum;
	}
}

void print(int* pArr,int iLen)
{
	if(!pArr || iLen <= 0)
	{
		return;
	}
	for(int i = 0 ; i < iLen ; i++)
	{
		if(i)
		{
			printf(" %d",pArr[i]);
		}
		else
		{
			printf("%d",pArr[i]);
		}
	}
	printf("\n");
}

void process()
{
	int n;
	int iArr[MAXSIZE];
	while(EOF != scanf("%d",&n))
	{
		if(n <= 0)
		{
			break;
		}
		for(int i = 0 ; i < n ; i++)
		{
			scanf("%d",&iArr[i]);
		}
		insertSort_recursion(iArr,n);
		print(iArr,n);
	}
}

int main(int argc,char* argv[])
{
	process();
	getchar();
	return 0;
}