试以单链表为存储结构实现简单选择排序的算法

简单选择排序,就是每趟把剩余元素最小或者最大的选出来排到前面

这道题值得推敲的是,p作为一个链表结点也是可以作为for循环的初始条件和判断条件的,至于查找到最小值之后,可以把两者的数值进行一个交换,就不用删结点再插结点了。

还有一种比较有意思的思路是,你实在不会对链表进行操作,你可以把链表元素全读到一个数组中,然后对数组进行一个排序,最后再把数组中元素带回去(这种方法感兴趣读者可以自行尝试,这是万不得已不要用的,因为题目已经明确要求你用单链表,投机取巧的方法遇到严格老师会扣很多分)

void change(int* a,int* b) {
	int tmp = *b;
	*b = *a;
	*a = tmp;
}
void selectSort(LinkList* L) {
	LNode* p = (*L)->next;
	LNode* min = NULL;
	LNode* q = NULL;
	for (p;p != NULL;p = p->next) {
		q = p;
		min = p;
		for (q;q != NULL;q = q->next) {
			if (q->data < min->data) {
				min = q;
			}
		}
		if (min != p) {
			change(&(p->data), &(min->data));
		}
	}
}
int main()
{
	LinkList L;
	InitList2(&L);
	printf("初始链表为:");
	print2(L);
	
	printf("\n排序后链表为:");
	selectSort(&L);
	print2(L);
}

在这里插入图片描述
ps:链表初始化及打印函数

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdbool.h>
#include<malloc.h>
//单链表定义
//链表结点
int A[10] = {3,9,2,1,6,7,4,0,5,8};
int B[6] = { 4,7,8,9,11,13 };//4,7,8,9,11,13
typedef struct {//定义单链表结点类型
	int data;//数据域
	struct LNode *next;//指针域
}LNode, *LinkList;

//带头结点初始化-尾插法
void InitList2(LinkList* L) {
	(*L) = (LNode*)malloc(sizeof(LNode));
	(*L)->next = NULL;
	LNode* rear = (*L);//标记表尾
	int i = 0;
	for (i = 0;i < 10;i++) {
		LNode* p = (LNode*)malloc(sizeof(LNode));//创建一个新结点
		p->data = A[i];//新结点赋值
		rear->next = p;//接到L上
		rear = p;//标记表尾
	}
	rear->next = NULL;
}

void print2(LinkList L) {//打印带头结点的链表
	LNode* i = L->next;//用i指针遍历整个链表
	while (i != NULL) {
		printf("%d ", i->data);
		i = i->next;
	}
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 链表实现简单选择排序算法的步骤如下: 1. 定义一个链表结构体,包含数据域和指针域。 2. 定义一个函数,用于创建链表。 3. 定义一个函数,用于实现简单选择排序算法。 4. 在排序函数中,遍历链表,找到最小值节点,并将其与头节点交换。 5. 重复以上步骤,直到链表排序完成。 6. 最后,输出排序后的链表。 具体实现细节可以参考以下代码: ``` #include <stdio.h> #include <stdlib.h> // 定义链表结构体 typedef struct node { int data; struct node *next; } Node; // 创建链表 Node *createList(int n) { Node *head = NULL, *p = NULL, *q = NULL; int i, data; for (i = 1; i <= n; i++) { printf("请输入第%d个节点的值:", i); scanf("%d", &data); p = (Node *)malloc(sizeof(Node)); p->data = data; p->next = NULL; if (head == NULL) { head = p; } else { q->next = p; } q = p; } return head; } // 实现简单选择排序算法 void selectSort(Node *head) { Node *p = head, *q = NULL, *min = NULL; int temp; while (p != NULL) { min = p; q = p->next; while (q != NULL) { if (q->data < min->data) { min = q; } q = q->next; } if (min != p) { temp = min->data; min->data = p->data; p->data = temp; } p = p->next; } } // 输出链表 void printList(Node *head) { Node *p = head; while (p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); } int main() { int n; printf("请输入链表的长度:"); scanf("%d", &n); Node *head = createList(n); printf("排序前的链表:"); printList(head); selectSort(head); printf("排序后的链表:"); printList(head); return 0; } ``` ### 回答2: 简单选择排序是一种常用的排序算法,它的实现思路比较简单,可以利用链表存储结构实现。下面我们来介绍一下如何利用链表实现简单选择排序算法。 首先,我们需要定义一个链表结构体,包括表头指针和数据域等内容。然后,我们需要利用链表存储排序的数据。在链表中,每个节点的值代表一个待排序的元素,通过节点之间的“指针”来实现元素之间的连接。 接着,我们可以通过循环来遍历链表中的所有节点,找到每次循环中的最小值节点,将其放在队列中的最前面。具体步骤为: 1. 遍历链表,找到当前循环中的最小值节点,并将它保存下来; 2. 将当前循环中的最小值节点从链表中删除,然后将其插入到队列的最前面。 3. 迭代上述步骤,直到链表排序完成。 在实现算法时,需要考虑一些细节问题。例如,在删除节点时,需要记录每个节点的前驱节点,以便于删除操作的正确执行。同时,在插入节点时,也需要同时保存当前插入位置节点的前驱节点和后继节点,以保证插入的正确性。 总之,利用链表作为存储结构,可以很方便地实现简单选择排序算法。同时,也需要注意一些细节问题,以确保算法的正确性。这种方法不仅简洁易懂,而且效率比较高,因此在实际应用中也得到了广泛的应用。 ### 回答3: 简单选择排序是一种基础的排序算法,在这个算法中,我们需要不断选出未排序部分中的最小元素,把它放到已排序部分的末尾。在链表实现简单选择排序算法还是比较容易的,我们可以通过遍历链表来找到最小元素,然后把它插入到已排序部分的末尾。 首先,我们需要定义一个链表,用来存储待排元素。链表的每一个节点都包含一个数据域和一个指向下一个节点的指针域。 然后,我们遍历链表,找到未排序部分中的最小元素。方法是通过一个min指针,依次遍历每个节点,每次比较节点的数据域和min指针所指向的节点的数据域,如果当前节点比min指向的节点的数据域小,就把min指针指向当前节点。 找到最小元素之后,我们把它从链表中删除,然后把它插入到已排序部分的末尾。插入的方法是,从头节点开始遍历链表,找到最后一个节点,然后把最小元素插入到最后一个节点的后面。需要注意的是,如果最小元素是链表中的第一个节点,我们需要把头节点指针更新为它。 重复以上步骤,直到所有元素都被排序。最终,我们得到的链表就是排好序的。 虽然链表实现简单选择排序算法的思路简单,但是需要处理指针操作,需要谨慎处理边界条件。同时,由于链表的插入和删除操作需要遍历链表,所以时间复杂度比较高,为O(n^2)。所以,在实际应用中,如果排序的数据量比较大,我们需要采用其他更高效的排序算法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

劲夫学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值