【离散数学】生成排序

证明的过程就不详细解释了,这里主要是把排序的过程和代码写一下;

这里说的是一个数字排序的问题:给你1到n个数字,让你给它们排序成一个你位数的数字,并且从小到大输出;

过程:

最小的数字无疑是把数字从小到大排序,比如n==5的时候,最小数字是 12345,这里有一个循环的过程,主要的过程有两个:

首先,在数字中,从倒数第二个开始找一个数a【j】,且在a【j+1】~a【n】中,找比a【j】大的数,存在的话,就找出其中最小的那个大于a【j】的数,然后和a【j】交换,交换后,给a【j+1】~a【n】内的数从小到大排序,那么,将不存在比原排序大而又比新排序小的数字;如果a【j】在a【j+1】~a【n】中找不到大于a【j】的数,那么将j--,即a【j-1】在a【j】~a【n】内查找,不断的循环这个过程,直到第一个数字a【1】在a【2】~a【n】找不到一个大于a【1】的数,那么循环停止;

下面给出核心代码(伪代码而且只是循环了一次,我们需要计算出需要循环的次数,然后在for中循环调用函数就行了):


void f(int a[])
{
	j = n - 1; // 从倒数第二个找
	while(a[j] > a[j+1])  j--; //找出一个大于a[j]的数的下标 
	
	k = n;
	while(a[j]>a[k])  k--;//找出最小的那个大于a[j]的下标,然后交换 
	
	swap(a[j],a[k]);
	//自己在纸上模拟一下就可以知道,每次交换后的a[j+1]~a[n]一下的数字其实
	//都是从大到小排序的,我们只需要把他们倒过来就是从小到大的了
	//不用在特意去搞排序法排序 
	right = n;
	left = j + 1;
	while(right > left)  {
		swap(a[right],a[left]) 
		right--; left++;
	}
}







猜你喜欢

转载自blog.csdn.net/godleaf/article/details/80205397