单链表排序之选择排序

***单链表排序之选择排序***



/*
前段时间刚学会几种排序方法,最近学习了单链表,就用来试试,本篇链表的排序方法<一>讲述的是
单链表的选择排序;(注意:请仔细看准节点结构体的包装和头指针的包装再阅读以下代码);

选择排序的基本思想:对比数组中前一个元素跟后一个元素的大小,如果后面的元素比前面的元素小则用一个变量k来记住他的位置,接着第二次比较,前面“后一个元素”现变成了“前一个元素”,继续跟他的“后一个元素”进行比较如果后面的元素比他要小则用变量k记住它在数组中的位置(下标),等到循环结束的时候,我们应该找到了最小的那个数的下标了,然后进行判断,如果这个元素的下标不是第一个元素的下标,就让第一个元素跟他交换一下值,这样就找到整个数组中最小的数了。然后找到数组中第二小的数,让他跟数组中第二个元素交换一下值,以此类推。

其实再通俗一点就是,假设数组有好几个元素,我的第一个位置就是给数组里最小的元素留的位置,如果第一个位置现在的元素不是最小,那么不好意思,请让开位置,把最小的元素换过来(注意是交换过来);接下来第一个就不管了,位置固定死了,第二个位置又是为剩下的所有元素中最小的元素准备的,如果当前位置里的元素不是最小,那么不好意思,选择剩下元素最小的那个和它交换,以此类推;

选择排序的数组排序的我已经总结过了,这里就将选择排序复用到单链表里面;
*/

/*  举个例子:
   4------->3------->2------>6------->over;
   p->data = 4; q->data =  4;
   内层第一次:4 = 4,不交换,q->data = 3; 4 > 3(交换);则p->data = 3;
   继续,q->data = 2, 3 > 2(交换),则p->data = 2;
   继续,q->data = 6, 2 < 6(不交换),则p->data = 2;
   第一次完成后:
   p->data = 2; 后面的顺序不用考虑;第一个节点也不用管了, p = p->next,
   从下一个节点开始,以此类推;
 */

#include<stdio.h>
#include<assert.h>

typedef int DataType;

typedef struct LinkNode
{
	DataType data;
	struct LinkNode* next;
}LinkNode,*pLinkNode;//结点结构体

typedef struct LinkList
{
	LinkNode* pHead;//头结点指针
}LinkList ,*pLinkList;//链表

算法实现:

void SelectSort(pLinkList pList)//选择排序单链表
{
	pLinkNode p = NULL;
	pLinkNode q = NULL;
	assert(pList);

	for(p = pList ->pHead ;p!=NULL; p = p->next )
	{
		//注意:q = p->next 外循环进来每次向后挪动一个;
		for(q = p->next;q!=NULL; q = q->next )//找最小的结点
		{
			if(p->data > q->data )//只要大就交换,改变的只是data
			{
				DataType tmp = q->data ;
				q->data  = p->data ;
				p->data = tmp;
			}
		}//第一次内层循环结束后,就已经将最小的放入第一个节点的data 中了;
		 //以此类推;
	}
}

接下来还会完成单链表的直接插入和冒泡排序!
  • 23
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值