当前位置:首页 » 编程语言 » 头歌C语言排序问题
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

头歌C语言排序问题

发布时间: 2022-09-14 07:39:18

c语言中的链表排序问题

link sort(link head) //head为表头结点
{
link beforep,p,p1,k,beforek,temp;
if(head==NULL)printf("信息系统为空!!!按任意键回到主菜单!\n"); //表头节点为空即链表为空
else
{p=head; //指针p指向表头
while(p->next!=NULL) //当链表没有遍历完执行循环体
{
k=p; //指针k指向指针p
p1=p->next; //指针p1指向指针p的下一个节点
while(p1!=NULL) //当指针p1不为空,执行循环体
{
if(k->aver<p1->aver)k=p1; //这里的k->表示k所指向对象的aver成员
p1=p1->next; //当k指向的aver成员小于p1指向的aver成员,k指向p1
} //这个循环结束后,k将指向链表中p之后所有节点的aver成员最小的那个节点,这是插入排序的搜索过程
if(k!=p) //如果aver成员最小的节点不是p所指向的节点
{
beforek=head; //beforek从头结点往后寻找
while(beforek->next!=k)beforek=beforek->next; //循环结束后,beforek指针将指向k指针的前一个节点,因为条件beforek->next==k 才结束循环
if(p==head)head=k; //如果p是头结点,头结点指向k(k是成员aver最小的,排在第一个节点作为头结点)?
else beforep->next=k; //否则beforep->next指向k,(请注意这里的beforep与刚才的beforek不一样)
beforek->next=p; //beforek->next指向指针p
temp=k->next;
k->next=p->next;
p->next=temp; //交换k->next和p->next指针
p=k; //p指向k
} //这个函数体运行结束后,p指针指向链表aver成员最小的那个节点,这也就是插入排序的交换过程
beforep=p; //指针回指
p=p->next; // 遍历下一个节点
}
printf("排序成功,按任意键回到主菜单!\n");
}
return(head); //返回头结点
}

如果还是看不懂,你就留Q追问我

Ⅱ 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;i<10;i++) scanf("%d",&a[i]); /*排序*/ for(j=0;j<9;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;i<10;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;i<10;i++) scanf("%d",&a[i]); for(i=0;i main() { int a[10],i,j,t; printf("Please input 10 numbers: "); for(i=0;i<10;i++) scanf("%d",&a[i]); for(i=1;i*外循环控制趟数,n个数从第2个数开始到最后共进行n-1次插入*/ { t=a[i]; /*将待插入数暂存于变量t中*/ for( j=i-1 ; j>=0 && t>a[j] ; j-- ) /*在有序序列(下标0 ~ i-1)中寻找插入位置*/ a[j+1]=a[j]; /*若未找到插入位置,则当前元素后移一个位置*/ a[j+1]=t; /*找到插入位置,完成插入*/ } printf("The sorted numbers: "); for(i=0;i<10;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语言比较大小排序问题

#define N 10//宏定义,用N代替10
#include "stdio.h"//标准输入输出库,你在控制台输入数据和显示数据用的
main()//主函数
{
int a[N],i,j,temp;//声明需要排序的数组a和排序用的的一些“小工具”,i、j、temp
printf("请输入%d个整数:\n",N);
for(i=0;i<N;i++)//这个循环是和用户交互,手动输入10个数理组成数组
scanf("%d",&a[i]);
for(i=0;i<N-1-i;i++)//i从前往后数
for(j=0;j<N-1-i;j++)//在每一个i(比如0,比如1)下从前往后数j
if(a[j]>a[j+1])//如果j比他后边的大,交换
{temp=a[j];a[j]=a[j+1];a[j+1]=temp;}//两数前后互换
//上边这个循环就是从前往后数a的元素,比如到a[0],那么最大的数移到最后一位;在比如a[1],倒数第二大的数移到倒数第二位(因为最大的在后边,你移步过去了?)
//为什么要走这么多次。每次j的循环都好比一个波浪,一次只能保证一个最大数到了最后一位,其他的可能还是乱序,所以要一浪接一浪。
//这个算法的巧妙之处在于,i只走一半,也就是i从0到4,而j每次也不用到最后一位(j<N-1-i),因为最后那i+1位已经排好了
//比较次数,i=0时9次,i=1时8次,i=2时7次,i=3时6次,i=4时5次,一共35次
printf("排序之后的数据序列:\n");
for(i=0;i<N;i++)//把排序后的数列显示出来,%5d代表每一个数占5位,就是排列的整齐点。
printf("%5d",a[i]);
printf("\n");
}

#include"stdio.h"
#define N 10
main()
{
int a[N],i,j,r,temp;
printf("请输入%d个整数:\n",N);
for(i=0;i<N;i++)
scanf ("%d",&a[i]);
for(i=0;i<N-1;i++)//用i遍历数组a。
{r=i;//局部的r值,i从0到8每次不同,r也不同。
for(j=i+1;j<N;j++)//j是从i当前的值一直到最后(前一种排序时每次j的结尾位置不同,到9,到8.到7。)
if(a[j]<a[r])r=j;//用r标记最小的一个值,
if(r!=i)//如果这个最小的值不是a[i],对换,让i所在值变成最小,意思是a[0]最小,a[1]第二小,以此类推
{temp=a[r];a[r]=a[i];a[i]=temp;}
}
printf("排序之后的数据序列:\n");
for(i=0;i<N;i++)
printf("%5d",a[i]);
printf("\n");

//i=0,j循环9次;i=1,j循环8次。。。。一共45次
}

我把函数改了,这样可以测试,你去跑一下就明白过程了

#include"stdio.h"
#define N 10
main()
{
int count = 0;
int a[N],i,j,r,temp;
printf("请输入%d个整数:\n",N);
for(i=0;i<N;i++)
scanf ("%d",&a[i]);
for(i=0;i<N-1;i++)
{r=i;
for(j=i+1;j<N;j++){
if(a[j]<a[r])r=j;

count++;
printf("i:%d\tj:%d\tcount:%d\n",i,j,count);
}
if(r!=i)
{temp=a[r];a[r]=a[i];a[i]=temp;}
}
printf("排序之后的数据序列:\n");
for(i=0;i<N;i++)
printf("%5d",a[i]);
printf("\n%d\n",count);
}

Ⅳ C语言数组排序问题

搞定, 用户手动输入数列,可以是正负数。宏定义 MAX_STRING_SIZE 决定用户输入的最大字符长度, MAX_ARRAY_SIZE决定用户最多输入的整数个数。

bubble_sort() 函数实现冒泡法排序, 第一个参数为被排序数组,第二个参数为数组长度,地三个参数为排序方式, 0 表示从小到大,非0表示从大到小。

/* vim: set et sw=4: */
#include <stdio.h>
#include <string.h>

#define MAX_STRING_SIZE (4096)
#define MAX_ARRAY_SIZE (100)

#define COMPARE(a, b, comp_type) (comp_type == 0 ? (a > b) : (a < b))

/* sort_type = 0, small to large, else in reverse order */
void bubble_sort(int * ar, int size, int sort_type)
{
int swapped, i, val;
do
{
swapped = 0;
for(i = 0; i < size - 1; i++)
{
if(COMPARE(ar[i], ar[i+1], sort_type))
{
val = ar[i];
ar[i] = ar[i+1];
ar[i+1] = val;
swapped++;
}
}
size--;
} while(swapped != 0);
}

int main()
{
char buffer[MAX_STRING_SIZE];
char * p;
int array[MAX_ARRAY_SIZE];
int i, len, num_count;
char ch;

printf("Input number serials, seperated by white spaces!\n");
len = num_count = 0;
while(((ch = getchar()) != '\n') && len < MAX_STRING_SIZE)
{
if(ch >= '0' && ch <= '9')
{
buffer[len++] = ch;
}
else
{
switch(ch)
{
case ' ':
buffer[len++] = '\0';
break;
case '-':
case '+':
buffer[len++] = ch;
break;
default:
printf("\nInvalid character!\n");
return -1;
}

}
}
buffer[len] = '\0';

for(i = 0; i < len; i += (strlen(p)+1))
{
p = &buffer[i];
if(*p != '\0')
{
if(num_count >= MAX_ARRAY_SIZE)
{
printf("array is full (total %d elements), remaining numbers are discarded!\n", num_count);
break;
}
array[num_count++] = atoi(p);
}
}

if(num_count > 1)
{
/* sort first half by reverse order */
bubble_sort(array, num_count/2, 1);
/* sort last part */
if(num_count % 2)
{
bubble_sort(&array[num_count/2 + 1], num_count/2, 0);
}
else
{
bubble_sort(&array[num_count/2], num_count/2, 0);
}
}

printf("After sorting:\n");
for(i = 0; i < num_count; i++)
{
printf("%d ", array[i]);
}
printf("\n");

return 0;
}

Ⅳ c语言数组排序问题

#include
#include
int main(void)
{
char cName[5][10],temp[10];
float fScore[5],ftemp;
int i,j,k;
printf("输入学生的姓名和成绩: ");
for(i=0;i<5;i++)
{
printf("cName[%d]是:",i);
scanf("%s",cName[i]);
printf("成绩为:");
scanf("%f",&fScore[i]);
}
for(i=0;i<5;i++)
{
k=i;
for(j=i+1;j<5;j++)
if(fScore[k]>fScore[j])
{
k=j;}

if(k!=i)

{ strcpy(temp,cName[i]);
strcpy(cName[i],cName[k]);
strcpy(cName[k],temp);
ftemp=fScore[i];
fScore[i]=fScore[k];
fScore[k]=ftemp;
}
}
printf("成绩由低到高的顺序为: ");
for(i=0;i<5;i++)
{

printf("%s的成绩为%f ",cName[i],fScore[i]);
}
return 0;

}