您的位置:

升序或降序最小交换次数c语言,c语言升序排序函数

本文目录一览:

请高手精细地讲解C语言的冒泡排序法,解释每个语句,以及升序和降序问题?

例:int a[10] ; //设有10个元素的int型数组

int i = 0 , j = 0 , n = 0;

for( i = 0 ; i 9 ; i++ ) //外层循环最大值为数组大小减一

{

for( j = i+1 ; j 10 ; j++ ) //内层循环从外层循环的后面一

//个数(j=i+1)开始,到最后

{

if( a[i] a[j] ) //该比较大小所示为升序。

//若a[i] a[j] ,交换的话,为降序。(前大升,后大降)

{

n = a[i] ;

a[i] = a[j] ; //交换

a[j] = n ;

}

}

} //完成

编程,不会就问,很好!但,更重要的是,必须自己先好好想过之后,还不明白,再问,再查资料(很重要)。呵呵···

c语言排列问题

下面是C语言里面常用的三种排序方法,但愿对楼主有帮助,一、冒泡法(起泡法)算法要求:用起泡法对10个整数按升序排序。算法分析:如果有n个数,则要进行n-1趟比较。在第1趟比较中要进行n-1次相邻元素的两两比较,在第j趟比较中要进行n-j次两两比较。比较的顺序从前往后,经过一趟比较后,将最值沉底(换到最后一个元素位置),最大值沉底为升序,最小值沉底为降序。算法源代码: # include main() { int a[10],i,j,t; printf("Please input 10 numbers: "); /*输入源数据*/ for(i=0;i10;i++) scanf("%d",a[i]); /*排序*/ for(j=0;j9;j++) /*外循环控制排序趟数,n个数排n-1趟*/ for(i=0;i*内循环每趟比较的次数,第j趟比较n-j次*/ if(a[i]a[i+1]) /*相邻元素比较,逆序则交换*/ { t=a[i]; a[i]=a[i+1]; a[i+1]=t; } /*输出排序结果*/ printf("The sorted numbers: "); for(i=0;i10;i++) printf("%d ",a[i]); printf("\n"); } 算法特点:相邻元素两两比较,每趟将最值沉底即可确定一个数在结果的位置,确定元素位置的顺序是从后往前,其余元素可能作相对位置的调整。可以进行升序或降序排序。算法分析:定义n-1次循环,每个数字比较n-j次,比较前一个数和后一个数的大小。然后交换顺序。二、选择法算法要求:用选择法对10个整数按降序排序。算法分析:每趟选出一个最值和无序序列的第一个数交换,n个数共选n-1趟。第i趟假设i为最值下标,然后将最值和i+1至最后一个数比较,找出最值的下标,若最值下标不为初设值,则将最值元素和下标为i的元素交换。算法源代码: # include main() { int a[10],i,j,k,t,n=10; printf("Please input 10 numbers:"); for(i=0;i10;i++) scanf("%d",a[i]); for(i=0;i main() { int a[10],i,j,t; printf("Please input 10 numbers: "); for(i=0;i10;i++) scanf("%d",a[i]); for(i=1;i*外循环控制趟数,n个数从第2个数开始到最后共进行n-1次插入*/ { t=a[i]; /*将待插入数暂存于变量t中*/ for( j=i-1 ; j=0 ta[j] ; j-- ) /*在有序序列(下标0 ~ i-1)中寻找插入位置*/ a[j+1]=a[j]; /*若未找到插入位置,则当前元素后移一个位置*/ a[j+1]=t; /*找到插入位置,完成插入*/ } printf("The sorted numbers: "); for(i=0;i10;i++) printf("%d ",a[i]); printf("\n"); } 算法特点:每趟从无序序列中取出第一个数插入到有序序列的合适位置,元素的最终位置在最后一趟插入后才能确定位置。也可是先用循环查找插入位置(可从前往后或从后往前),再将插入位置之后的元素(有序列中)逐个后移一个位置,最后完成插入。该算法的特点是在寻找插入位置的同时完成元素的移动。因为元素的移动必须从后往前,则可将两个操作结合在一起完成,提高算法效率。仍可进行升序或降序排序。二、下面是三种排序的概念及其优缺点冒泡排序已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变。再比较a[2]与a[3]的值,若a[2]大于a[3]则交换两者的值,否则不变。再比较a[3]与a[4],依此类推,最后比较a[n-1]与a[n]的值。这样处理一轮后,a[n]的值一定是这组数据中最大的。再对a[1]~a[n-1]以相同方法处理一轮,则a[n-1]的值一定是a[1]~a[n-1]中最大的。再对a[1]~a[n-2]以相同方法处理一轮,依此类推。共处理n-1轮后a[1]、a[2]、……a[n]就以升序排列了。优点:稳定,比较次数已知;缺点:慢,每次只能移动相邻两个数据,移动数据的次数多。选择排序已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变。再比较a[1]与a[3]的值,若a[1]大于a[3]则交换两者的值,否则不变。再比较a[1]与a[4],依此类推,最后比较a[1]与a[n]的值。这样处理一轮后,a[1]的值一定是这组数据中最小的。再将a[2]与a[3]~a[n]以相同方法比较一轮,则a[2]的值一定是a[2]~a[n]中最小的。再将a[3]与a[4]~a[n]以相同方法比较一轮,依此类推。共处理n-1轮后a[1]、a[2]、……a[n]就以升序排列了。优点:稳定,比较次数与冒泡排序一样,数据移动次数比冒泡排序少;缺点:相对之下还是慢。插入排序已知一组升序排列数据a[1]、a[2]、……a[n],一组无序数据b[1]、b[2]、……b[m],需将二者合并成一个升序数列。首先比较b[1]与a[1]的值,若b[1]大于a[1],则跳过,比较b[1]与a[2]的值,若b[1]仍然大于a[2],则继续跳过,直到b[1]小于a数组中某一数据a[x],则将a[x]~a[n]分别向后移动一位,将b[1]插入到原来a[x]的位置这就完成了b[1]的插入。b[2]~b[m]用相同方法插入。(若无数组a,可将b[1]当作n=1的数组a)优点:稳定,快;缺点:比较次数不一定,比较次数越少,插入点后的数据移动越多,特别是当数据总量庞大的时候,但用链表可以解决这个问题。

用选择法将一组数字升序排序,谁懂C语言,谢谢

选择排序的原理为:

一次选定数组中的每一个数,记下当前位置并假设它是从当前位置开始后面数中的最小数min=i,从这个数的下一个数开始扫描

直到最后一个数,并记录下最小数的位置min,扫描结束后如果min不等于i,说明假设错误,则交换min与i位置上的数。

代码如下:

void selectionSort(double *p, int n)

{

double temp;

int min, i, j;

for (i=0; i n; i++)

{

min=i; //假设最小值的下标为i

for (j=i+1; j n; j++) //查找i之后是否有更小的数,若有将其下标赋值给min

if (*(p+j) *(p+min))

min = j;

if (min != i) //min不等于i说明i之后有更小的数,交换这两个数

{

temp = *(p+i);

*(p+i) = *(p+min);

*(p+min) = temp;

}

}

}

参考程序如下:

#include stdio.h

#include malloc.h

double *selectionSort(double *p, int n)

{

double temp;

int min, i, j;

for (i=0; i n; i++)

{

min=i; //假设最小值的下标为i

for (j=i+1; j n; j++) //查找i之后是否有更小的数,若有将其下标赋值给min

if (*(p+j) *(p+min))

min = j;

if (min != i) //min不等于i说明i之后有更小的数,交换这两个数

{

temp = *(p+i);

*(p+i) = *(p+min);

*(p+min) = temp;

}

}

return p;

}

void main()

{

int n;

double *p;

printf ("输入数据个数:\n");

scanf("%d",n);

p = (double *)malloc(n*sizeof(double));

printf("输入数据:\n");

for(int i=0;in;i++)

scanf("%lf",p[i]);

p = selectionSort(p,n);

printf("输出升序结果:\n");

for(i=0;in;i++)

printf ("%lf\t",p[i]);

printf("\n");

}

C语言的升序和降序

#includestdio.h

void main()

{

int a[5]={};

int i,j;

int temp=0;

for(i=0;i5;i++)

{

printf("请输入第%d个整数\n",i+1);

scanf("%d",a[i]);

}

for(i=1;i5;i++)

{

for(j=0;j5-i;j++)

{

if(a[j]a[j+1])....................//把大于号改成小于号

{

temp=a[j];

a[j]=a[j+1];

a[j+1]=temp;

}

}

}

for(i=0;i5;i++)

{

printf("排序后的整数:%d\t",a[i]);

}

}

if(a[j]a[j+1])....................//把大于号改成小于号