单链表-C语言选择排序法和冒泡法区别问题

问题描述

C语言选择排序法和冒泡法区别问题

编程实现将给定的一组整数采用选择排序法按由小到大的顺序排序。要求:
1) 编写函数create()根据已知整数数组构造一个单链表,假设结点只有一个整数数据域。
2) 编写函数sort()采用选择排序方法对已知链表进行排序。
3) 在主函数中完成数据的输入与结果的输出。
===我自己写了一个程序,但是不确定选择排序法是什么,求大侠帮忙看下我写的代码sort()是选择排序吗?感觉自己混淆了选择排序法和冒泡排序了,求教如何区别?
#include
#include
typedef struct list
{ int data;
struct list next;
} SLIST;
SLIST *creat(int *a)
{ SLIST *h,*p,*q; int i;
h=p=(SLIST *)malloc(sizeof(SLIST));
for(i=0; i
{ q=(SLIST *)malloc(sizeof(SLIST));
q->data=a[i]; p->next=q; p=q;
}
p->next=0;
return h;
}
void sort(SLIST *h)
{ SLIST *p, *q; int t;
p = h ;
while (p) {
q = p->next ;
while (q) {
if (p->data> q->data)
{

t = p->data;

p->data = q->data;

q->data = t;

}
q = q->next;
}
p = p->next;
}
}
main()
{ SLIST *head,*p;

int a[8]={11,10,25,18,29,22,15,19};
head=creat(a);
printf("
The list before sorting:
");
p=head->next;
if (p==NULL)

printf("
The list is NULL!
");
else
{ printf("
Head");
do
{
printf("->%d",p->data);

p=p->next;

} while(p!=NULL);
printf("->End
");
}

sort(head);
printf("
The list after sorting:
");
p=head->next;
if (p==NULL)

printf("
The list is NULL!
");
else
{ printf("
Head");
do
{
printf("->%d",p->data);

p=p->next;

} while(p!=NULL);
printf("->End
");
}
}
/

1.程序运行结果为:
The list before sorting:

Head->11->10->25->18->29->22->15->19->End

The list after sorting:

Head->10->11->15->18->19->22->25->29->End
*/

解决方案

C语言中经典冒泡法与选择排序法

解决方案二:

冒泡,只对相邻比较,交换
选择,选一个最大(最小)值,多次比较,一次交换

解决方案三:

冒泡我就不拍了,主要区别就是,选择排序需要设置一个哨兵,就像打擂台,上来先给个值,然后比较,谁更小,或者谁更大,就替换,直到最后结束;冒泡就是相邻元素比较然后替换,逐次进行,就像泡泡,这回你明白了吧,你的代码,在我手机上看是一堆密密麻麻的,没法仔细瞧…望采纳

时间: 2024-12-02 15:45:38

单链表-C语言选择排序法和冒泡法区别问题的相关文章

编程c语言-关于c语言选择法和冒泡法的区别,新手疑问

问题描述 关于c语言选择法和冒泡法的区别,新手疑问 两种方法怎样区别,求简单解释 解决方案 c语言冒泡法 解决方案二: 冒泡:把最小的数放在最后,不断地把底层的较大的数冒泡升上来: 选择:用一个变量不断地选择小的数,将值付给变量再通过变量付给相应位置的数组元素. 解决方案三: 1.冒泡排序基本思想就是对一组数据自上而下,对相邻的两个数作比较,每次让大的气泡向下沉,让小的气泡向上浮. 例如:3,1,9,2 几个数字,第一轮:3和1比较,3>1,所以交换位置:继续3和9比较,32,9和2交换: 结果

java-哪位大神能具体讲一下冒泡法和选择排序的用法,区别?

问题描述 哪位大神能具体讲一下冒泡法和选择排序的用法,区别? 哪位大神能具体讲一下冒泡法和选择排序的用法,区别? 解决方案 冒泡排序就是把小的元素往前调或者把大的元素往后调.比较是相邻的两个元素比较,交换也发生在这两个元素之间.所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的:如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法. #include <stdio.h> #defin

单链表的建立、排序和翻转

链表: 1.注意是否有带头结点. 2.单链表的建立:顺序建表(尾插法).逆序建表(头插法). 3.单链表的插入.删除操作需要寻找前驱结点. 单链表的建立.排序和翻转,都是针对有头结点的单链表. #include <iostream> using namespace std; typedef struct Node { int data; Node * next; }Node,*List; //顺序建表:尾插法 void CreateLinkList(List& L, int n) {

图片-C语言选择排序,最后一个数字后的三角形是什么鬼??

问题描述 C语言选择排序,最后一个数字后的三角形是什么鬼?? 代码在这: #include<stdio.h> int main() { void sort(int *x,int n); int i,*p,a[5]; p=a; printf("please enter 5 numbers:n"); for(i=0;i<5;i++) { scanf("%d",p++); } p=a; sort(p,5); for(p=a,i=0;i<5;i++)

图片-C语言选择排序法的的困惑

问题描述 C语言选择排序法的的困惑 解决方案 k!=i,交换,这个要写在循环的外面. 解决方案二: 请问你的困惑是什么? 解决方案三: 这样改改就可以了. 解决方案四: 自己设断点查看数据变化这样学练效果最佳 解决方案五: 把 if(k!=i) 这个判断块放到第一层的for里,而不是第二层的for里. 选择排序是每次找出一个最大或者最小值,第二个for只是找出那个值就可以了,交换要放到第一层for里进行. 解决方案六: void select_sort(int*a,int n) { regist

c语言-C语言选择排序,帮我看看吧,谢谢了

问题描述 C语言选择排序,帮我看看吧,谢谢了 #include void main() { int aa[]={2,7,5,3,1,9,4}; int i,j,a; for (i=0;i<6;i++) { a=1; for(int j=i+1;j<7;j++) { if(aa[j]<a) a=j; } int t=aa[i]; aa[i]=aa[a]; aa[a]=t; } for(i=0;i<7;i++) printf("%d ",aa[i]); } 解决方案

C语言选择排序算法及实例代码_C 语言

选择排序是排序算法的一种,这里以从小到大排序为例进行讲解. 基本思想及举例说明 选择排序(从小到大)的基本思想是,首先,选出最小的数,放在第一个位置:然后,选出第二小的数,放在第二个位置:以此类推,直到所有的数从小到大排序. 在实现上,我们通常是先确定第i小的数所在的位置,然后,将其与第i个数进行交换. 下面,以对 3  2  4  1 进行选择排序说明排序过程,使用min_index 记录当前最小的数所在的位置. 第1轮 排序过程 (寻找第1小的数所在的位置) 3  2  4  1(最初, m

单链表-C语言求教merge(struct node *p,struct node *q)哪里出错了?

问题描述 C语言求教merge(struct node *p,struct node *q)哪里出错了? #include "stdio.h" #include "stdlib.h" struct node { int data; struct node next; }; struct node *creat(int *a) { struct node*h,*p,*q; int i; h=p=(struct node)malloc(sizeof(struct nod

单链表-c语言单向链表的问题???

问题描述 c语言单向链表的问题??? #include<stdio.h>#include<stdlib.h>struct node{ int num; struct node *next;};//构建空的链表struct node* InitList(struct node *L){ L = (struct node*)malloc(sizeof(struct node)); L = NULL; printf_s(""InitList sucess!"