计算机算法中的递归法与选择排序法是什么?请细讲

如题所述

递归是设计和描述算法的一种有力的工具,由于它在复杂算法的描述中被经常采用,为此在进一步介绍其他算法设计方法之前先讨论它。
能采用递归描述的算法通常有这样的特征:为求解规模为N的问题,设法将它分解成规模较小的问题,然后从这些小问题的解方便地构造出大问题的解,并且这些规模较小的问题也能采用同样的分解和综合方法,分解成规模更小的问题,并从这些更小问题的解构造出规模较大问题的解。特别地,当规模N=1时,能直接得解。

递归算法的执行过程分递推和回归两个阶段。在递推阶段,把较复杂的问题(规模为n)的求解推到比原问题简单一些的问题(规模小于n)的求解。例如上例中,求解fib(n),把它推到求解fib(n-1)和fib(n-2)。也就是说,为计算fib(n),必须先计算fib(n-1)和fib(n-2),而计算fib(n-1)和fib(n-2),又必须先计算fib(n-3)和fib(n-4)。依次类推,直至计算fib(1)和fib(0),分别能立即得到结果1和0。在递推阶段,必须要有终止递归的情况。例如在函数fib中,当n为1和0的情况。
在回归阶段,当获得最简单情况的解后,逐级返回,依次得到稍复杂问题的解,例如得到fib(1)和fib(0)后,返回得到fib(2)的结果,……,在得到了fib(n-1)和fib(n-2)的结果后,返回得到fib(n)的结果。
在编写递归函数时要注意,函数中的局部变量和参数知识局限于当前调用层,当递推进入“简单问题”层时,原来层次上的参数和局部变量便被隐蔽起来。在一系列“简单问题”层,它们各有自己的参数和局部变量。
由于递归引起一系列的函数调用,并且可能会有一系列的重复计算,递归算法的执行效率相对较低。当某个递归算法能较方便地转换成递推算法时,通常按递推算法编写程序。例如上例计算斐波那契数列的第n项的函数fib(n)应采用递推算法,即从斐波那契数列的前两项出发,逐次由前两项计算出下一项,直至计算出要求的第n项。

选择排序法 是对 定位比较交换法 的一种改进。在讲选择排序法之前我们先来了解一下定位比较交换法。为了便于理解,设有10个数分别存在数组元素a[0]~a[9]中。定位比较交换法是由大到小依次定位a[0]~a[9]中恰当的值(和武林大会中的比武差不多),a[9]中放的自然是最小的数。如定位a[0],先假定a[0]中当前值是最大数,a[0]与后面的元素一一比较,如果a[4]更大,则将a[0]、a[4]交换,a[0]已更新再与后面的a[5]~a[9]比较,如果a[8]还要大,则将a[0]、a[8]交换,a[0]又是新数,再与a[9]比较。一轮比完以后,a[0]就是最大的数了,本次比武的武状元诞生了,接下来从a[1]开始,因为状元要休息了,再来一轮a[1]就是次大的数,也就是榜眼,然后从a[2]开始,比出探花,真成比武大会了,当必到a[8]以后,排序就完成了。
下面给大家一个例子:
mai()
{
int a[10];
int i,j,t;
for ( i = 0; i < 10; i ++ ) scanf("%d",&a[ i ]); /*输入10个数,比武报名,报名费用10000¥ ^_^*/
for ( i = 0; i < 9; i ++ )
for ( j = i + 1; j < 10; j ++)
if ( a[ i ] < a[ j ] ) { t = a[ i ]; a[ i ] = a[ j ]; a[ j ] = t; } /*打不过就要让出头把交椅,不过a[ i ]比较爱面子,不好意思见 a[ j ],让t帮忙*/
for( i = 0; i < 10; i ++) printf("%4d",a[ i ]); /*显示排序后的结果*/
}
好啦,罗嗦了半天总算把定位比较排序法讲完了,这个方法不错,容易理解,就是有点麻烦,一把椅子换来换去,哎~
所以就有了下面的选择排序法,开始的时候椅子谁也不给,放在一边让大家看着,找个人k记录比赛结果,然后发椅子。具体来讲呢就是,改进定位比较排序法,但是这个改进只是一部分,比较的次数没变,该怎么打还是怎么打,就是不用换椅子了。每次外循环先将定位元素的小标i值记录到K,认为a[k]是最大元素其实i=k还是a[ i ]最大,a[k]与后面的元素一一比较,该交换的也是也不换,就是把K的值改变一下就完了,最后在把a[k]与a[ i ]交换,这样a就是最大的元素了。然后进入下一轮的比较。选择排序法与定位比较排序法相比较,比的次数没变,交换的次数减少了。
下面也写个例子:
main()
{
int a[10];
int i,j,t,k;
for ( i = 0; i < 10; i ++ ) scanf("%d",&a[ i ]); /*输入10个数,比武报名,报名费用10000¥ ^_^*/
for ( i = 0; i < 9; i ++ )
{ k = i; /*裁判AND记者实时追踪报道比赛情况*/
for ( j = i + 1; j < 10; j ++)
if ( a[ k ] < a[ j ] ) k = j;
t = a[ i ]; a[ i ] = a[ k ]; a[ k ] = t; /* t 发放奖品*/
}
for( i = 0; i < 10; i ++) printf("%4d",a[ i ]); /*显示排序后的结果*/
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-09-21
选择法排序是一种简单的容易实现的对数据排序的算法。

以整形数组元素为例,有数组A[10](以C语言为例描述),即A[0],A[1],…,A[8],A[9](假设其元素均互不相同)。要求对其元素排序使之递增有序。

算法原理:首先以一个元素为基准,从一个方向开始扫描,比如从左至右扫描,以A[0]为基准。接下来从A[0],…,A[9]中找出最小的元素,将其与A[0]交换。然后将基准位置右移一位,重复上面的动作,比如,以A[1]为基准,找出A[1]~A[9]中最小的,将其与A[1]交换。一直进行到基准位置移到数组最后一个元素时排序结束(此时基准左边所有元素均递增有序,而基准为最后一个元素,故完成排序)。

以下为一个用C描述的函数实现上述排序:

void sort(int array[],int n) // n 为数组元素个数
{
int i,j,k,temp; // i 为基准位置,j 为当前被扫描元素位置,k 用于暂存出现的较小的元素的位置
for(i=0;i<n-1;i++)
{
k=i; // k 初始化为基准位置
for(j=i+1;j<n;j++)
if (array[j]<array[k]) k=j ; // k 始终指示出现的较小的元素的位置
temp=array[k];array[k]=array;array=temp; // 将此趟扫描得到的最小元素与基准互换位置
}
}

此算法的实现相对简单,但效率比较低,时间复杂度为O(n2) (n 的平方),为就地排序。

递归法比较好理解``
计算1+2+....+100的值
#include <stdio.h>
main()
{
printf("%d\n",fun(100));//调用函数fun()
}
递归函数
fun(int n)
{int t; <br/>if(n==0||n==1) t=1; //如果n为0或为1 输出1 <br/>//n大于0,则为第n项和第n-1项的和,继续调用fun() <br/>//以此类推... <br/>else t=n+fun(n-1); <br/>return t; <br/>}

#include <stdio.h>
main()
{printf("%d\n",fun(100));}
fun(int n)
{int t; <br/>if(n==0||n==1) t=1; <br/>else t=n+fun(n-1); <br/>return t; <br/>}
第2个回答  2013-09-21
计算1+2+....+100的值
#include <stdio.h>
main()
{
printf("%d\n",fun(100));//调用函数fun()
}
递归函数
fun(int n)
{int t; <br/>if(n==0||n==1) t=1; //如果n为0或为1 输出1 <br/>//n大于0,则为第n项和第n-1项的和,继续调用fun() <br/>//以此类推... <br/>else t=n+fun(n-1); <br/>return t; <br/>}

什么叫快速排序 qsort
#include<string.h>
#include<stdlib.h>
#include<stdio.h>

struct student{
int xuehao;
char name[20];
int chengji;
};

typedef struct student stu;

sortbyxuehao(const void *,const void *);
sortbyname(const void *,const void *);
sortbychengji(const void *,const void *);

void main()
{
int i;
stu a[3];
int choice;
int (*p)(const void * ,const void *);

printf("please input record:\n");
printf("xuehao name chengji:\n");
for(i=0;i<3;i++)
{
scanf("%d",&a[i].xuehao);
scanf("%s",a[i].name);
scanf("%d",&a[i].chengji);
}
printf("choice_1: sorted xuehao:\n");
printf("choice_2: sorted name\n");
printf("choice_3: sorted chengji\n");

scanf("%d",&choice);
while(choice!=0)
{
if(choice==1)
p=sortbyxuehao;
if(choice==2)
p=sortbyname;
if(choice==3)
p=sortbychengji;

qsort(a,3,sizeof(stu),p);

if(choice==1)
for(i=0;i<3;i++)
printf("\n%d\t%s\t%d",a[i].xuehao,a[i].name,a[i].chengji);
if(choice==2)
for(i=0;i<3;i++)
printf("\n%s\t%d\t%d",a[i].name,a[i].xuehao,a[i].chengji);
if(choice==3)
for(i=0;i<3;i++)
printf("\n%d\t%s\t%d",a[i].chengji,a[i].name,a[i].xuehao);
printf("\n");
scanf("%d",&choice);
}

}

sortbyxuehao(const void *p,const void *q)
{
stu *x,*y;
x=(stu*)p;
y=(stu*)q;

return (-((*x).xuehao-(*y).xuehao));
}

sortbyname(const void *p,const void *q)
{
stu *x,*y;
x=(stu*)p;
y=(stu*)q;

return strcmp((*x).name,(*y).name);

}

sortbychengji(const void *p,const void *q)
{
stu *x,*y;
x=(stu*)p;
y=(stu*)q;

return ((*x).chengji-(*y).chengji);

}

计算机算法中的递归法与选择排序法是什么?请细讲
选择排序法 是对 定位比较交换法 的一种改进。在讲选择排序法之前我们先来了解一下定位比较交换法。为了便于理解,设有10个数分别存在数组元素a[0]~a[9]中。定位比较交换法是由大到小依次定位a[0]~a[9]中恰当的值(和武林大会中的比武差不多),a[9]中放的自然是最小的数。如定位a[0],...

《算法图解》
选择排序是一种直观且简单的排序方法。它通过重复地选择未排序元素中的最小值,并将其插入到已排序元素序列的末尾来实现排序。这种方法的效率相对较低,但其简单易懂的特点使它成为学习排序算法的起点。第三章 递归 递归是一种解决问题的方法,它将问题分解成更小的相同问题,直到问题变得简单到可以直接...

六种方法数组排序
方法一:选择排序与循环 选择排序通过循环遍历数组,每次选取最小元素与当前未排序部分的第一个元素交换位置,直至数组完全排序。方法二:选择排序与递归 递归选择排序首先从数组中选取一个元素作为基准,然后递归地在剩余部分找到最小值与基准交换位置。这一过程反复进行,直至数组排序完成。方法三:快速排序 ...

python 算法有哪些比赛
选择排序算法:选择排序是一种简单直观的排序算法。原理:首先在未排序序列中找到最小或最大元素,存放到排序序列的起始位置;然后,再从剩余未排序元素中继续寻找最大最小元素,然后放到已排序序列的后面,以此类推直到所有元素均排序完毕。2.快速排序算法:快速排序的运行速度快于选择排序。原理:设要排序...

<算法图解>
选择排序:o(n方),快速排序:o(nlogn),存储最小的值,存储最小元素的索引,找出最小的值,加到新数组中。循环,程序的性能更好,递归,程序更容易理解。栈有两种操作:压入和弹出。每个递归函数都有两部分:基线条件和递归条件,递归条件指的是函数调用自己,基线条件指的是函数不再调用自己,避免...

计算机二级C语言主要考点?
指令系统:一个计算机系统能执行的所有指令的集合。 基本运算和操作包括:算术运算、逻辑运算、关系运算、数据传输。 算法的控制结构:顺序结构、选择结构、循环结构。 算法基本设计方法:列举法、归纳法、递推、递归、减斗递推技术、回溯法。 算法复杂度:算法时间复杂度和算法空间复杂度。 算法时间复杂度是指执行算法所...

JS算法——排序算法
快速排序利用分治法选择一个基准元素,将数组分为小于基准的部分和大于基准的部分,递归排序两部分。其关键在于基准的选择与分区操作。堆排序通过构建并维护最大堆,将堆顶元素与末尾交换,再调整堆至最大堆状态,重复此过程直至排序完成。其算法步骤包括:构建最大堆,交换堆顶与末尾元素,调整剩余部分为...

简要说明计算思维有哪些主要的方法?
递归法:递归是一种在函数中调用自身的方法,它可以用来解决许多问题,例如排序、搜索等。在递归中,问题被分解为更小的子问题,直到子问题变得足够简单,可以直接解决。分治法:分治法是将问题划分为更小的子问题,并分别解决这些子问题,然后将这些子问题的解组合起来得到原问题的解。分治法可以用来解决...

紧急!!!有什么排序方法?各有什么特点?
选择排序的基本思想是:对待排序的记录序列进行n-1遍的处理,第1遍处理是将L[1..n]中最小者与L[1]交换位置,第2遍处理是将L[2..n]中最小者与L[2]交换位置,...,第i遍处理是将L[i..n]中最小者与L[i]交换位置。这样,经过i遍处理之后,前i个记录的位置就已经按从小到大的顺序排列好了。例1:输入...

排序算法
常见的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序和堆排序等。解释:排序算法是计算机科学中非常重要的一类算法,其主要目的是将一组数据按照特定的顺序进行排列。以下是几种常见的排序算法的介绍:1. 冒泡排序:这是一种简单的排序算法,它通过不断地比较和交换相邻元素来将最大值或最...

相似回答